OAUTH 2.1
GEOSPATIAL
Felt holds the maps, layers, and spatial data your team reasons about together. Felt MCP gives your agent authenticated access scoped to the user who authorized it.
For more tools, view docs.
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";
const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
// Felt MCP tools, scoped to the signed-in user
const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["feltmcp"], toolNames: [
"feltmcp_add_data_source_table_to_map",
"feltmcp_browse_data_source_tables",
"feltmcp_browse_felt_library"
] },
pageSize: 100,
});
const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Which service areas overlap the new territory?" }] });import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";
const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
// Felt MCP tools, scoped to the signed-in user
const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["feltmcp"], toolNames: [
"feltmcp_add_data_source_table_to_map",
"feltmcp_browse_data_source_tables",
"feltmcp_browse_felt_library"
] },
pageSize: 100,
});
const openai = new OpenAI();
const res = await openai.responses.create({
model: "gpt-5",
tools: tools.map((t) => t.openai),
input: "Which service areas overlap the new territory?",
});import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";
const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
// Felt MCP tools, scoped to the signed-in user
const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["feltmcp"], toolNames: [
"feltmcp_add_data_source_table_to_map",
"feltmcp_browse_data_source_tables",
"feltmcp_browse_felt_library"
] },
pageSize: 100,
});
const anthropic = new Anthropic();
const msg = await anthropic.messages.create({
model: "claude-opus-4-6",
max_tokens: 1024,
tools: tools.map((t) => t.anthropic),
messages: [{ role: "user", content: "Which service areas overlap the new territory?" }],
});import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";
const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
// Felt MCP tools, scoped to the signed-in user
const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["feltmcp"], toolNames: [
"feltmcp_add_data_source_table_to_map",
"feltmcp_browse_data_source_tables",
"feltmcp_browse_felt_library"
] },
pageSize: 100,
});
const agent = new Agent({
name: "feltmcp_agent",
model: "gemini-2.5-pro",
instruction: "Act as the geospatial agent for the signed-in user.",
tools,
});
await agent.run("Which service areas overlap the new territory?");// shared token
audit → bot_service_account
user_filter → broken
// scalekit
audit → user_abc
scope → enforced ✓