arcade-mcp/examples/agent_frameworks/langchain-ts/langchain-tool-arcade-auth.ts
Eric Gustin d7107c107d
Update examples (#601)
* Reorganize the examples folder
* Add two mcp server examples. A local filesystem server and a simple
'starter' server.
2025-10-03 17:37:22 -07:00

79 lines
2.1 KiB
TypeScript

import { Arcade } from "@arcadeai/arcadejs";
import {
GmailCreateDraft,
GmailGetMessage,
GmailGetThread,
GmailSearch,
GmailSendMessage,
} from "@langchain/community/tools/gmail";
import type { StructuredTool } from "@langchain/core/tools";
import { createReactAgent } from "@langchain/langgraph/prebuilt";
import { ChatOpenAI } from "@langchain/openai";
// Initialize Arcade with API key from environment
const arcade = new Arcade();
// Replace this with your application's user ID (e.g. email address, UUID, etc.)
const USER_ID = "user@example.com";
// Start the authorization process for Gmail
// see all possible gmail scopes here:
// https://developers.google.com/gmail/api/auth/scopes
const authResponse = await arcade.auth.start(USER_ID, "google", {
scopes: ["https://www.googleapis.com/auth/gmail.readonly"],
});
// Prompt the user to authorize if not already completed
if (authResponse.status !== "completed") {
console.log("Please authorize the application in your browser:");
console.log(authResponse.url);
}
// Wait for the user to complete the authorization process, if necessary...
const completedAuth = await arcade.auth.waitForCompletion(authResponse);
if (!completedAuth.context?.token) {
throw new Error("Failed to get authorization token");
}
// Get Gmail tools with credentials
const gmailParam = {
credentials: {
accessToken: completedAuth.context.token,
},
};
const tools: StructuredTool[] = [
new GmailCreateDraft(gmailParam),
new GmailGetMessage(gmailParam),
new GmailGetThread(gmailParam),
new GmailSearch(gmailParam),
new GmailSendMessage(gmailParam),
];
// Initialize the language model and create an agent
const llm = new ChatOpenAI({ model: "gpt-4o" });
const agent_executor = createReactAgent({
llm,
tools,
});
// Define the user query
const exampleQuery = "Read my latest emails and summarize them.";
// Execute the agent with the user query
const events = await agent_executor.stream(
{
messages: [
{
role: "user",
content: exampleQuery,
},
],
},
{
streamMode: "values",
},
);
for await (const event of events) {
console.log(event.messages[event.messages.length - 1]);
}