@cencori/mcp 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/server.ts","../src/http.ts","../src/client.ts","../src/docs/client.ts","../src/tools/docs.ts","../src/tools/shared.ts","../src/tools/gateway.ts","../src/tools/agents.ts","../src/tools/memory.ts","../src/tools/sessions.ts","../src/tools/governance.ts","../src/tools/multimodal.ts","../src/tools/guidance.ts"],"sourcesContent":["import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { loadConfig } from './config.js';\nimport { createServer } from './server.js';\n\nasync function main(): Promise<void> {\n const config = loadConfig();\n const server = createServer(config);\n const transport = new StdioServerTransport();\n\n await server.connect(transport);\n const enabledFeatures = Object.entries(config.features)\n .filter(([, enabled]) => enabled)\n .map(([feature]) => feature)\n .join(', ');\n\n const tier = config.capabilities.destructive\n ? 'read+write+destructive'\n : config.capabilities.write\n ? 'read+write'\n : 'read-only';\n\n console.error(\n `Cencori MCP server running (tier=${tier}, base=${config.baseUrl}, features=${enabledFeatures}, apiKey=${config.apiKey ? 'configured' : 'not set'})`,\n );\n}\n\nmain().catch((error) => {\n console.error('Fatal error:', error);\n process.exit(1);\n});\n","const DEFAULT_BASE_URL = 'https://cencori.com';\n\nexport type McpFeature =\n | 'docs'\n | 'gateway'\n | 'agents'\n | 'memory'\n | 'sessions'\n | 'multimodal'\n | 'governance'\n | 'guidance';\n\nconst KNOWN_FEATURES: readonly McpFeature[] = [\n 'docs',\n 'gateway',\n 'agents',\n 'memory',\n 'sessions',\n 'multimodal',\n 'governance',\n 'guidance',\n];\n\n/**\n * Action tiers the server is allowed to expose. Reads are always available\n * (given a key); writes and destructive actions are opt-in via env.\n */\nexport interface McpCapabilities {\n /** Non-destructive writes + inference. CENCORI_MCP_WRITE. */\n write: boolean;\n /** Deletes and approvals. CENCORI_MCP_DESTRUCTIVE (implies write). */\n destructive: boolean;\n}\n\nexport interface McpConfig {\n docsBaseUrl: string;\n baseUrl: string;\n apiKey?: string;\n capabilities: McpCapabilities;\n features: Record<McpFeature, boolean>;\n}\n\nfunction normalizeBaseUrl(value: string): string {\n return value.replace(/\\/$/, '');\n}\n\nfunction parseBooleanEnv(value: string | undefined, defaultValue: boolean): boolean {\n if (value === undefined) {\n return defaultValue;\n }\n\n return !['0', 'false', 'no', 'off'].includes(value.trim().toLowerCase());\n}\n\nfunction isMcpFeature(value: string): value is McpFeature {\n return (KNOWN_FEATURES as readonly string[]).includes(value);\n}\n\nfunction allFeaturesEnabled(): Record<McpFeature, boolean> {\n return {\n docs: true,\n gateway: true,\n agents: true,\n memory: true,\n sessions: true,\n multimodal: true,\n governance: true,\n guidance: true,\n };\n}\n\nfunction parseFeatures(value: string | undefined): Record<McpFeature, boolean> {\n if (!value || value.trim() === '') {\n return allFeaturesEnabled();\n }\n\n const tokens = value\n .split(',')\n .map((feature) => feature.trim().toLowerCase())\n .filter(Boolean);\n\n const unrecognized = tokens.filter((token) => !isMcpFeature(token));\n if (unrecognized.length > 0) {\n console.error(\n `[cencori-mcp] Ignoring unrecognized CENCORI_MCP_FEATURES value(s): ${unrecognized.join(', ')}. ` +\n `Known features: ${KNOWN_FEATURES.join(', ')}.`,\n );\n }\n\n const enabled = new Set(tokens.filter(isMcpFeature));\n\n return {\n docs: enabled.has('docs'),\n gateway: enabled.has('gateway'),\n agents: enabled.has('agents'),\n memory: enabled.has('memory'),\n sessions: enabled.has('sessions'),\n multimodal: enabled.has('multimodal'),\n governance: enabled.has('governance'),\n guidance: enabled.has('guidance'),\n };\n}\n\nexport function loadConfig(): McpConfig {\n const docsBaseUrl = normalizeBaseUrl(process.env.CENCORI_DOCS_BASE_URL ?? DEFAULT_BASE_URL);\n const baseUrl = normalizeBaseUrl(process.env.CENCORI_BASE_URL ?? DEFAULT_BASE_URL);\n const apiKey = process.env.CENCORI_API_KEY?.trim() || undefined;\n const features = parseFeatures(process.env.CENCORI_MCP_FEATURES);\n\n // Destructive implies write. Both default off — reads-only unless opted in.\n const destructive = parseBooleanEnv(process.env.CENCORI_MCP_DESTRUCTIVE, false);\n const write = destructive || parseBooleanEnv(process.env.CENCORI_MCP_WRITE, false);\n\n return {\n docsBaseUrl,\n baseUrl,\n apiKey,\n capabilities: { write, destructive },\n features,\n };\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { PlatformClient } from './client.js';\nimport { DocsClient } from './docs/client.js';\nimport type { McpConfig } from './config.js';\nimport {\n registerAgentsTools,\n registerDocsTools,\n registerGatewayTools,\n registerGovernanceTools,\n registerGuidanceTools,\n registerMemoryTools,\n registerMultimodalTools,\n registerSessionsTools,\n} from './tools.js';\n\nconst SERVER_NAME = 'cencori';\nconst SERVER_VERSION = '0.5.0';\n\nexport function createServer(config: McpConfig): McpServer {\n const server = new McpServer(\n {\n name: SERVER_NAME,\n version: SERVER_VERSION,\n websiteUrl: 'https://cencori.com/docs',\n },\n {\n capabilities: {\n tools: {},\n },\n },\n );\n\n const { features, capabilities } = config;\n\n // Docs + guidance need no API key.\n if (features.docs) {\n const docs = new DocsClient(config.docsBaseUrl);\n registerDocsTools(server, docs, config.docsBaseUrl);\n }\n if (features.guidance) {\n registerGuidanceTools(server, config.baseUrl);\n }\n\n // Everything else needs a key. Reads register whenever a key is present;\n // multimodal inference is Write-tier (incurs cost) so it needs the flag.\n if (config.apiKey) {\n const client = new PlatformClient(config.baseUrl, config.apiKey);\n\n if (features.gateway) registerGatewayTools(server, client);\n if (features.agents) registerAgentsTools(server, client, capabilities);\n if (features.memory) registerMemoryTools(server, client, capabilities);\n if (features.sessions) registerSessionsTools(server, client, capabilities);\n if (features.governance) registerGovernanceTools(server, client, capabilities);\n\n if (features.multimodal && capabilities.write) {\n registerMultimodalTools(server, client);\n }\n }\n\n return server;\n}\n","/** Default timeout for outbound MCP → Cencori HTTP calls. */\nexport const FETCH_TIMEOUT_MS = 15_000;\n\nexport function fetchSignal(): AbortSignal {\n return AbortSignal.timeout(FETCH_TIMEOUT_MS);\n}\n\n/**\n * Extract a useful error message from a failed HTTP response.\n * Prefers JSON `error` / `error.message` over bare statusText.\n */\nexport async function readHttpErrorMessage(response: Response): Promise<string> {\n const errorData = (await response.json().catch(() => null)) as\n | { error?: string | { message?: string; code?: string } }\n | null;\n\n if (typeof errorData?.error === 'string') {\n return errorData.error;\n }\n\n if (errorData?.error && typeof errorData.error === 'object' && errorData.error.message) {\n return errorData.error.message;\n }\n\n return response.statusText || `HTTP ${response.status}`;\n}\n","import { fetchSignal, readHttpErrorMessage } from './http.js';\n\nexport type MetricsPeriod = '1h' | '24h' | '7d' | '30d' | 'mtd';\n\nexport interface AgentConfig {\n model: string | null;\n system_prompt: string | null;\n tools: string[];\n temperature: number | null;\n}\n\nexport interface Agent {\n id: string;\n name: string;\n description: string | null;\n is_active: boolean;\n shadow_mode: boolean;\n created_at: string;\n updated_at?: string;\n config: AgentConfig;\n}\n\nexport interface AgentListItem {\n id: string;\n name: string;\n description: string | null;\n is_active: boolean;\n shadow_mode: boolean;\n created_at: string;\n}\n\nexport interface ModelListResponse {\n object: 'list';\n data: Array<{\n id: string;\n object: 'model';\n created: number;\n owned_by: string;\n name?: string;\n type?: string | string[];\n context_window?: number;\n description?: string;\n }>;\n providers?: Array<{\n id: string;\n name: string;\n model_count: number;\n }>;\n}\n\nexport interface MetricsResponse {\n period: string;\n start_date: string;\n end_date: string;\n requests: {\n total: number;\n success: number;\n error: number;\n filtered: number;\n success_rate: number;\n };\n cost: {\n total_usd: number;\n average_per_request_usd: number;\n };\n tokens: {\n prompt: number;\n completion: number;\n total: number;\n };\n latency: {\n avg_ms: number;\n p50_ms: number | null;\n p90_ms: number | null;\n p99_ms: number | null;\n };\n providers: Record<string, { requests: number; cost_usd: number }>;\n models: Record<string, { requests: number; cost_usd: number }>;\n}\n\nexport type HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE';\n\nexport interface RequestOptions {\n searchParams?: Record<string, string | undefined>;\n body?: unknown;\n}\n\nexport class PlatformClient {\n constructor(\n private readonly baseUrl: string,\n private readonly apiKey: string,\n ) {}\n\n /**\n * Low-level request against the Cencori API. Sends `Authorization: Bearer`,\n * which the gateway accepts for both `/v1/*` and `/api/ai/*` routes.\n */\n async request<T = unknown>(method: HttpMethod, path: string, options: RequestOptions = {}): Promise<T> {\n const url = new URL(`/api${path}`, this.baseUrl);\n\n if (options.searchParams) {\n for (const [key, value] of Object.entries(options.searchParams)) {\n if (value !== undefined) {\n url.searchParams.set(key, value);\n }\n }\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n };\n const init: RequestInit = { method, headers, signal: fetchSignal() };\n\n if (options.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n init.body = JSON.stringify(options.body);\n }\n\n const response = await fetch(url, init);\n\n if (!response.ok) {\n const message = await readHttpErrorMessage(response);\n throw new Error(`Cencori API error: ${message}`);\n }\n\n // Some routes (e.g. DELETE) may return an empty body.\n const text = await response.text();\n if (!text) {\n return undefined as T;\n }\n return JSON.parse(text) as T;\n }\n\n get<T = unknown>(path: string, searchParams?: Record<string, string | undefined>): Promise<T> {\n return this.request<T>('GET', path, { searchParams });\n }\n\n post<T = unknown>(path: string, body?: unknown, searchParams?: Record<string, string | undefined>): Promise<T> {\n return this.request<T>('POST', path, { body, searchParams });\n }\n\n patch<T = unknown>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('PATCH', path, { body });\n }\n\n del<T = unknown>(path: string): Promise<T> {\n return this.request<T>('DELETE', path);\n }\n\n listModels(): Promise<ModelListResponse> {\n return this.get<ModelListResponse>('/v1/models');\n }\n\n getMetrics(period: MetricsPeriod = '7d'): Promise<MetricsResponse> {\n return this.get<MetricsResponse>('/v1/metrics', { period });\n }\n\n listAgents(): Promise<{ data: AgentListItem[] }> {\n return this.get<{ data: AgentListItem[] }>('/v1/agents');\n }\n\n getAgent(agentId: string): Promise<Agent> {\n return this.get<Agent>(`/v1/agents/${agentId}`);\n }\n}\n","import type {\n DocNavigationResponse,\n DocRawResponse,\n DocSearchResponse,\n} from './types.js';\nimport { fetchSignal, readHttpErrorMessage } from '../http.js';\n\nexport class DocsClient {\n constructor(private readonly baseUrl: string) {}\n\n async search(query: string): Promise<DocSearchResponse> {\n const url = new URL('/api/docs/search', this.baseUrl);\n url.searchParams.set('q', query);\n\n const response = await fetch(url, { signal: fetchSignal() });\n if (!response.ok) {\n const message = await readHttpErrorMessage(response);\n throw new Error(`Docs search failed (${response.status}): ${message}`);\n }\n\n return response.json() as Promise<DocSearchResponse>;\n }\n\n async getDoc(slug: string): Promise<DocRawResponse> {\n const normalizedSlug = slug.replace(/^\\/docs\\//, '').replace(/^\\//, '');\n const url = new URL('/api/docs/raw', this.baseUrl);\n url.searchParams.set('slug', normalizedSlug);\n\n const response = await fetch(url, { signal: fetchSignal() });\n if (response.status === 404) {\n return { content: '', error: `Document not found: ${normalizedSlug}` };\n }\n if (!response.ok) {\n const message = await readHttpErrorMessage(response);\n throw new Error(`Docs fetch failed (${response.status}): ${message}`);\n }\n\n return response.json() as Promise<DocRawResponse>;\n }\n\n async listNavigation(): Promise<DocNavigationResponse> {\n const url = new URL('/api/docs/navigation', this.baseUrl);\n const response = await fetch(url, { signal: fetchSignal() });\n if (!response.ok) {\n const message = await readHttpErrorMessage(response);\n throw new Error(`Docs navigation failed (${response.status}): ${message}`);\n }\n\n return response.json() as Promise<DocNavigationResponse>;\n }\n\n /** Fetch the raw `llm.txt` integration contract (public, no auth). */\n async getIntegrationGuide(): Promise<string> {\n const url = new URL('/llm.txt', this.baseUrl);\n const response = await fetch(url, { signal: fetchSignal() });\n if (!response.ok) {\n const message = await readHttpErrorMessage(response);\n throw new Error(`Integration guide fetch failed (${response.status}): ${message}`);\n }\n return response.text();\n }\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { DocsClient } from '../docs/client.js';\nimport { jsonResult, READ_ONLY_ANNOTATIONS } from './shared.js';\n\nexport function registerDocsTools(server: McpServer, docs: DocsClient, docsBaseUrl: string): void {\n server.registerTool(\n 'search_docs',\n {\n title: 'Search Cencori docs',\n description:\n 'Search Cencori documentation by keyword. Returns matching pages with title, section, URL, and snippet.',\n inputSchema: {\n query: z\n .string()\n .min(2)\n .describe('Search query (minimum 2 characters). Example: \"rate limiting\", \"api keys\", \"failover\".'),\n },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ query }) => {\n const { results } = await docs.search(query);\n return jsonResult({ query, count: results.length, results });\n },\n );\n\n server.registerTool(\n 'get_doc',\n {\n title: 'Get Cencori doc page',\n description:\n 'Fetch the raw markdown content of a Cencori documentation page by slug. Example slugs: \"quick-start\", \"ai/sdk\", \"api/chat\".',\n inputSchema: {\n slug: z\n .string()\n .min(1)\n .describe('Doc slug without /docs/ prefix. Example: \"ai/gateway\" or \"security/scan\".'),\n },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ slug }) => {\n const doc = await docs.getDoc(slug);\n const normalizedSlug = slug.replace(/^\\/docs\\//, '').replace(/^\\//, '');\n\n if (doc.error) {\n return jsonResult({ slug: normalizedSlug, error: doc.error });\n }\n\n return jsonResult({\n slug: normalizedSlug,\n url: `${docsBaseUrl}/docs/${normalizedSlug}`,\n content: doc.content,\n });\n },\n );\n\n server.registerTool(\n 'list_docs',\n {\n title: 'List Cencori docs',\n description:\n 'List the Cencori documentation table of contents grouped by section (Getting Started, Platform, AI, API Reference, etc.).',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => {\n const navigation = await docs.listNavigation();\n return jsonResult(navigation);\n },\n );\n\n server.registerTool(\n 'get_integration_guide',\n {\n title: 'Get the Cencori integration guide (llm.txt)',\n description:\n 'Fetch the full Cencori \"Integration Contract for Code Agents\" (llm.txt) — the authoritative, always-current guide for setting up Cencori in a codebase: package names, import paths, env vars, base URLs, SDK usage, request/response shapes, and step-by-step setup. Call this FIRST when asked to add, integrate, or set up Cencori in a project.',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => {\n const guide = await docs.getIntegrationGuide();\n return {\n content: [\n {\n type: 'text' as const,\n text: `Source: ${docsBaseUrl}/llm.txt\\n\\n${guide}`,\n },\n ],\n };\n },\n );\n}\n","export const READ_ONLY_ANNOTATIONS = {\n title: 'Read-only',\n readOnlyHint: true,\n destructiveHint: false,\n openWorldHint: false,\n} as const;\n\n/**\n * Non-destructive write / action (create, run inference). Mutates state or\n * incurs cost but does not delete or irreversibly change existing resources.\n * Gated behind CENCORI_MCP_WRITE.\n */\nexport const WRITE_ANNOTATIONS = {\n title: 'Write',\n readOnlyHint: false,\n destructiveHint: false,\n openWorldHint: false,\n} as const;\n\n/**\n * Destructive action (delete, approve/reject). Gated behind\n * CENCORI_MCP_DESTRUCTIVE. Clients should surface a confirmation.\n */\nexport const DESTRUCTIVE_ANNOTATIONS = {\n title: 'Destructive',\n readOnlyHint: false,\n destructiveHint: true,\n openWorldHint: false,\n} as const;\n\nexport function jsonResult(data: unknown) {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { PlatformClient, MetricsPeriod } from '../client.js';\nimport { jsonResult, READ_ONLY_ANNOTATIONS } from './shared.js';\n\nexport function registerGatewayTools(server: McpServer, client: PlatformClient): void {\n server.registerTool(\n 'list_models',\n {\n title: 'List Cencori gateway models',\n description: 'List models available through the Cencori gateway for the authenticated project.',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => {\n const models = await client.listModels();\n return jsonResult(models);\n },\n );\n\n server.registerTool(\n 'get_metrics',\n {\n title: 'Get Cencori gateway metrics',\n description:\n 'Get gateway usage metrics for the authenticated project, including requests, cost, tokens, latency, and model/provider breakdowns.',\n inputSchema: {\n period: z\n .enum(['1h', '24h', '7d', '30d', 'mtd'])\n .optional()\n .describe('Metrics time window. Allowed values: 1h, 24h, 7d, 30d, mtd.'),\n },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ period }) => {\n const metrics = await client.getMetrics(period as MetricsPeriod | undefined);\n return jsonResult(metrics);\n },\n );\n\n server.registerTool(\n 'get_health',\n {\n title: 'Get Cencori gateway health',\n description: 'Check gateway/platform health for the authenticated project.',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => jsonResult(await client.get('/v1/health')),\n );\n\n server.registerTool(\n 'check_quota',\n {\n title: 'Check billing quota',\n description: 'Check remaining quota/credits and usage limits for the authenticated project.',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => jsonResult(await client.get('/v1/billing/check-quota')),\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { PlatformClient } from '../client.js';\nimport type { McpCapabilities } from '../config.js';\nimport { jsonResult, READ_ONLY_ANNOTATIONS, WRITE_ANNOTATIONS, DESTRUCTIVE_ANNOTATIONS } from './shared.js';\n\nconst agentConfigShape = z\n .object({\n model: z.string().optional(),\n system_prompt: z.string().optional(),\n tools: z.array(z.string()).optional(),\n temperature: z.number().min(0).max(2).optional(),\n })\n .optional()\n .describe('Agent runtime config: model, system_prompt, tools, temperature.');\n\nexport function registerAgentsTools(server: McpServer, client: PlatformClient, caps: McpCapabilities): void {\n server.registerTool(\n 'list_agents',\n {\n title: 'List Cencori agents',\n description: 'List agents available to the authenticated project.',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => {\n const agents = await client.listAgents();\n return jsonResult(agents);\n },\n );\n\n server.registerTool(\n 'get_agent',\n {\n title: 'Get Cencori agent',\n description: 'Fetch the full configuration for one Cencori agent by ID.',\n inputSchema: {\n agent_id: z.string().min(1).describe('The agent ID to fetch.'),\n },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ agent_id }) => {\n const agent = await client.getAgent(agent_id);\n return jsonResult(agent);\n },\n );\n\n server.registerTool(\n 'poll_agent_actions',\n {\n title: 'Poll pending agent actions',\n description: 'Poll for pending actions queued for agents in the authenticated project.',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => jsonResult(await client.get('/v1/agent/actions/poll')),\n );\n\n if (caps.write) {\n server.registerTool(\n 'create_agent',\n {\n title: 'Create an agent',\n description: 'Create a new agent in a project.',\n inputSchema: {\n project_id: z.string().min(1).describe('The project id to create the agent in.'),\n name: z.string().min(1).describe('Agent name.'),\n description: z.string().optional(),\n config: agentConfigShape,\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ project_id, name, description, config }) =>\n jsonResult(await client.post('/v1/agents', { project_id, name, description, config })),\n );\n\n server.registerTool(\n 'update_agent',\n {\n title: 'Update an agent',\n description: 'Update an agent’s name, description, status, shadow mode, or config.',\n inputSchema: {\n agent_id: z.string().min(1).describe('The agent id to update.'),\n name: z.string().optional(),\n description: z.string().optional(),\n is_active: z.boolean().optional(),\n shadow_mode: z.boolean().optional(),\n config: agentConfigShape,\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ agent_id, name, description, is_active, shadow_mode, config }) =>\n jsonResult(\n await client.patch(`/v1/agents/${agent_id}`, {\n name,\n description,\n is_active,\n shadow_mode,\n config,\n }),\n ),\n );\n }\n\n if (caps.destructive) {\n server.registerTool(\n 'delete_agent',\n {\n title: 'Delete an agent',\n description: 'Permanently delete an agent by id. This cannot be undone.',\n inputSchema: { agent_id: z.string().min(1).describe('The agent id to delete.') },\n annotations: DESTRUCTIVE_ANNOTATIONS,\n },\n async ({ agent_id }) => jsonResult(await client.del(`/v1/agents/${agent_id}`)),\n );\n }\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { PlatformClient } from '../client.js';\nimport type { McpCapabilities } from '../config.js';\nimport { jsonResult, READ_ONLY_ANNOTATIONS, WRITE_ANNOTATIONS, DESTRUCTIVE_ANNOTATIONS } from './shared.js';\n\n/**\n * Memory tools. Reads are always registered; writes need CENCORI_MCP_WRITE and\n * deletes need CENCORI_MCP_DESTRUCTIVE.\n *\n * Memory is scoped to a user or a session (the only scopes today). Scoped tools\n * therefore require `user_id` (user scope, the default) or `session_id`\n * (session scope) — a bare call has no scope key and the API rejects it.\n */\n\nconst scopeShape = {\n namespace: z.string().optional().describe('Memory namespace to scope to.'),\n scope: z.enum(['user', 'session']).optional().describe('Memory scope. Defaults to \"user\".'),\n user_id: z.string().optional().describe('End-user id. REQUIRED for user scope (the default).'),\n session_id: z.string().optional().describe('Session id. REQUIRED for session scope.'),\n};\n\ntype ScopeArgs = { scope?: 'user' | 'session'; user_id?: string; session_id?: string };\n\n/** Returns a clear error message if the required scope key is missing, else null. */\nfunction missingScopeKey({ scope, user_id, session_id }: ScopeArgs): string | null {\n if ((scope ?? 'user') === 'session') {\n return session_id || user_id ? null : 'session_id (or user_id) is required for session scope.';\n }\n return user_id\n ? null\n : 'user_id is required for user scope (the default). Pass user_id, or use scope=\"session\" with session_id.';\n}\n\nconst scopeErr = (msg: string) => jsonResult({ error: 'missing_scope', message: msg });\n\nexport function registerMemoryTools(server: McpServer, client: PlatformClient, caps: McpCapabilities): void {\n server.registerTool(\n 'list_memories',\n {\n title: 'List memories',\n description: 'List stored memories for a user or session. Requires user_id (or session_id for session scope).',\n inputSchema: {\n ...scopeShape,\n limit: z.number().int().positive().max(100).optional(),\n cursor: z.string().optional().describe('Pagination cursor from a previous response.'),\n },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ namespace, scope, user_id, session_id, limit, cursor }) => {\n const err = missingScopeKey({ scope, user_id, session_id });\n if (err) return scopeErr(err);\n return jsonResult(\n await client.get('/v1/memory/list', {\n namespace,\n scope,\n userId: user_id,\n sessionId: session_id,\n limit: limit?.toString(),\n cursor,\n }),\n );\n },\n );\n\n server.registerTool(\n 'search_memory',\n {\n title: 'Search memory (semantic)',\n description: 'Semantically search a user’s or session’s memories. Requires user_id (or session_id for session scope).',\n inputSchema: {\n query: z.string().min(1).describe('Natural-language search query.'),\n ...scopeShape,\n top_k: z.number().int().positive().max(100).optional().describe('Max results.'),\n threshold: z.number().min(0).max(1).optional().describe('Similarity threshold.'),\n },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ query, namespace, scope, user_id, session_id, top_k, threshold }) => {\n const err = missingScopeKey({ scope, user_id, session_id });\n if (err) return scopeErr(err);\n return jsonResult(\n await client.post('/v1/memory/search', {\n query,\n namespace,\n scope,\n userId: user_id,\n sessionId: session_id,\n topK: top_k,\n threshold,\n }),\n );\n },\n );\n\n server.registerTool(\n 'get_memory',\n {\n title: 'Get a memory',\n description: 'Fetch a single memory by id.',\n inputSchema: { memory_id: z.string().min(1).describe('The memory id.') },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ memory_id }) => jsonResult(await client.get(`/v1/memory/${memory_id}`)),\n );\n\n server.registerTool(\n 'list_memory_entities',\n {\n title: 'List memory entities',\n description: 'List entities resolved from a user’s or session’s memory graph. Requires user_id (or session_id).',\n inputSchema: scopeShape,\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ namespace, scope, user_id, session_id }) => {\n const err = missingScopeKey({ scope, user_id, session_id });\n if (err) return scopeErr(err);\n return jsonResult(\n await client.get('/v1/memory/entities', { namespace, scope, userId: user_id, sessionId: session_id }),\n );\n },\n );\n\n server.registerTool(\n 'get_memory_graph',\n {\n title: 'Get memory entity graph',\n description: 'Traverse a user’s or session’s memory entity graph. Requires user_id (or session_id).',\n inputSchema: {\n ...scopeShape,\n entity: z.string().optional().describe('Entity to start traversal from.'),\n hops: z.number().int().positive().max(5).optional().describe('Traversal depth.'),\n },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ namespace, scope, user_id, session_id, entity, hops }) => {\n const err = missingScopeKey({ scope, user_id, session_id });\n if (err) return scopeErr(err);\n return jsonResult(\n await client.get('/v1/memory/graph', {\n namespace,\n scope,\n userId: user_id,\n sessionId: session_id,\n entity,\n hops: hops?.toString(),\n }),\n );\n },\n );\n\n server.registerTool(\n 'get_forget_suggestions',\n {\n title: 'Get forget suggestions',\n description: 'List memories the system suggests forgetting for a user or session. Requires user_id (or session_id).',\n inputSchema: scopeShape,\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ namespace, scope, user_id, session_id }) => {\n const err = missingScopeKey({ scope, user_id, session_id });\n if (err) return scopeErr(err);\n return jsonResult(\n await client.get('/v1/memory/forget-suggestions', {\n namespace,\n scope,\n userId: user_id,\n sessionId: session_id,\n }),\n );\n },\n );\n\n if (caps.write) {\n server.registerTool(\n 'remember_memory',\n {\n title: 'Remember a conversation turn',\n description:\n 'Store a user/assistant exchange as memory. Requires user_id (or session_id for session scope).',\n inputSchema: {\n user: z.string().min(1).describe('The user message.'),\n assistant: z.string().min(1).describe('The assistant response.'),\n ...scopeShape,\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ user, assistant, namespace, scope, user_id, session_id }) => {\n const err = missingScopeKey({ scope, user_id, session_id });\n if (err) return scopeErr(err);\n return jsonResult(\n await client.post('/v1/memory/remember', {\n user,\n assistant,\n namespace,\n scope,\n userId: user_id,\n sessionId: session_id,\n }),\n );\n },\n );\n\n server.registerTool(\n 'write_memory',\n {\n title: 'Write a memory',\n description: 'Store a single memory (a fact/note). Requires user_id (or session_id for session scope).',\n inputSchema: {\n content: z.string().min(1).describe('The memory content to store.'),\n importance: z.number().min(0).max(1).optional().describe('Importance weight 0–1.'),\n ...scopeShape,\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ content, importance, namespace, scope, user_id, session_id }) => {\n const err = missingScopeKey({ scope, user_id, session_id });\n if (err) return scopeErr(err);\n return jsonResult(\n await client.post('/v1/memory/write', {\n content,\n importance,\n namespace,\n scope,\n userId: user_id,\n sessionId: session_id,\n }),\n );\n },\n );\n\n server.registerTool(\n 'create_namespace',\n {\n title: 'Create a memory namespace',\n description: 'Create a new memory namespace.',\n inputSchema: {\n name: z.string().min(1).describe('Namespace name.'),\n description: z.string().optional(),\n embedding_model: z.string().optional().describe('Embedding model for this namespace.'),\n dimensions: z.number().int().positive().optional(),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ name, description, embedding_model, dimensions }) =>\n jsonResult(\n await client.post('/memory/namespaces', {\n name,\n description,\n embeddingModel: embedding_model,\n dimensions,\n }),\n ),\n );\n }\n\n if (caps.destructive) {\n server.registerTool(\n 'delete_memory',\n {\n title: 'Delete a memory',\n description: 'Permanently delete a memory by id. This cannot be undone.',\n inputSchema: { memory_id: z.string().min(1).describe('The memory id to delete.') },\n annotations: DESTRUCTIVE_ANNOTATIONS,\n },\n async ({ memory_id }) => jsonResult(await client.del(`/v1/memory/${memory_id}`)),\n );\n }\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { PlatformClient } from '../client.js';\nimport type { McpCapabilities } from '../config.js';\nimport { jsonResult, READ_ONLY_ANNOTATIONS, WRITE_ANNOTATIONS, DESTRUCTIVE_ANNOTATIONS } from './shared.js';\n\n/**\n * Agent session tools. Reads always register; create/turn need\n * CENCORI_MCP_WRITE; delete/approve/reject need CENCORI_MCP_DESTRUCTIVE.\n */\nexport function registerSessionsTools(server: McpServer, client: PlatformClient, caps: McpCapabilities): void {\n server.registerTool(\n 'list_sessions',\n {\n title: 'List agent sessions',\n description: 'List agent sessions for the project, optionally filtered by status or agent.',\n inputSchema: {\n status: z.string().optional().describe('Filter by session status.'),\n agent_id: z.string().optional().describe('Filter by agent id.'),\n page: z.number().int().positive().optional(),\n limit: z.number().int().positive().max(100).optional(),\n },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ status, agent_id, page, limit }) =>\n jsonResult(\n await client.get('/v1/sessions', {\n status,\n agent_id,\n page: page?.toString(),\n limit: limit?.toString(),\n }),\n ),\n );\n\n server.registerTool(\n 'get_session',\n {\n title: 'Get an agent session',\n description: 'Fetch one agent session by id.',\n inputSchema: { session_id: z.string().min(1).describe('The session id.') },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ session_id }) => jsonResult(await client.get(`/v1/sessions/${session_id}`)),\n );\n\n server.registerTool(\n 'get_session_events',\n {\n title: 'Get agent session events',\n description: 'List the event timeline for one agent session.',\n inputSchema: { session_id: z.string().min(1).describe('The session id.') },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ session_id }) => jsonResult(await client.get(`/v1/sessions/${session_id}/events`)),\n );\n\n if (caps.write) {\n server.registerTool(\n 'create_session',\n {\n title: 'Create an agent session',\n description: 'Start a new session for an agent.',\n inputSchema: {\n agent_id: z.string().min(1).describe('The agent id to start a session for.'),\n metadata: z.record(z.string(), z.unknown()).optional().describe('Optional session metadata.'),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ agent_id, metadata }) => jsonResult(await client.post('/v1/sessions', { agent_id, metadata })),\n );\n\n server.registerTool(\n 'add_session_turn',\n {\n title: 'Add a turn to a session',\n description: 'Run a turn in an agent session. Incurs usage/cost.',\n inputSchema: {\n session_id: z.string().min(1).describe('The session id.'),\n model: z.string().min(1).describe('Model id for the turn.'),\n input: z.string().min(1).describe('The user input for this turn.'),\n instructions: z.string().optional().describe('Optional system instructions.'),\n temperature: z.number().min(0).max(2).optional(),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ session_id, model, input, instructions, temperature }) =>\n jsonResult(\n await client.post(`/v1/sessions/${session_id}/turns`, {\n model,\n input,\n instructions,\n temperature,\n }),\n ),\n );\n }\n\n if (caps.destructive) {\n server.registerTool(\n 'delete_session',\n {\n title: 'Delete an agent session',\n description: 'Permanently delete an agent session by id. This cannot be undone.',\n inputSchema: { session_id: z.string().min(1).describe('The session id to delete.') },\n annotations: DESTRUCTIVE_ANNOTATIONS,\n },\n async ({ session_id }) => jsonResult(await client.del(`/v1/sessions/${session_id}`)),\n );\n\n server.registerTool(\n 'approve_session',\n {\n title: 'Approve a pending session action',\n description: 'Approve a pending action in an agent session (human-in-the-loop).',\n inputSchema: {\n session_id: z.string().min(1).describe('The session id.'),\n action_id: z.string().optional().describe('Specific pending action id, if any.'),\n },\n annotations: DESTRUCTIVE_ANNOTATIONS,\n },\n async ({ session_id, action_id }) =>\n jsonResult(await client.post(`/v1/sessions/${session_id}/approve`, { action_id })),\n );\n\n server.registerTool(\n 'reject_session',\n {\n title: 'Reject a pending session action',\n description: 'Reject a pending action in an agent session (human-in-the-loop).',\n inputSchema: {\n session_id: z.string().min(1).describe('The session id.'),\n action_id: z.string().optional().describe('Specific pending action id, if any.'),\n },\n annotations: DESTRUCTIVE_ANNOTATIONS,\n },\n async ({ session_id, action_id }) =>\n jsonResult(await client.post(`/v1/sessions/${session_id}/reject`, { action_id })),\n );\n }\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { PlatformClient } from '../client.js';\nimport type { McpCapabilities } from '../config.js';\nimport { jsonResult, READ_ONLY_ANNOTATIONS, WRITE_ANNOTATIONS } from './shared.js';\n\n/**\n * Governance tools. Reads always register; maker/draft writes (create_policy,\n * install_template) need CENCORI_MCP_WRITE. Activation and change-request\n * responses stay MANUAL — see the how_to_* guidance tools. There is\n * deliberately no destructive governance tool.\n */\nexport function registerGovernanceTools(server: McpServer, client: PlatformClient, caps: McpCapabilities): void {\n server.registerTool(\n 'list_policies',\n {\n title: 'List governance policies',\n description: 'List governance policies for the org, optionally filtered by status.',\n inputSchema: {\n status: z.enum(['draft', 'pending_review', 'active', 'retired']).optional(),\n },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ status }) => jsonResult(await client.get('/v1/governance/policies', { status })),\n );\n\n server.registerTool(\n 'list_roles',\n {\n title: 'List governance roles',\n description: 'List governance roles defined for the org.',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => jsonResult(await client.get('/v1/governance/roles')),\n );\n\n server.registerTool(\n 'list_change_requests',\n {\n title: 'List governance change requests',\n description: 'List maker-checker change requests for governance policies.',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => jsonResult(await client.get('/v1/governance/change-requests')),\n );\n\n server.registerTool(\n 'get_governance_ledger',\n {\n title: 'Get governance audit ledger',\n description: 'Read the immutable governance audit ledger.',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => jsonResult(await client.get('/v1/governance/ledger')),\n );\n\n server.registerTool(\n 'get_governance_evidence',\n {\n title: 'Get governance evidence',\n description: 'Read governance evidence records (enforcement decisions).',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => jsonResult(await client.get('/v1/governance/evidence')),\n );\n\n server.registerTool(\n 'list_governance_templates',\n {\n title: 'List governance policy templates',\n description: 'List installable governance policy templates.',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => jsonResult(await client.get('/v1/governance/templates')),\n );\n\n if (caps.write) {\n server.registerTool(\n 'create_policy',\n {\n title: 'Draft a governance policy',\n description:\n 'Create a governance policy as a DRAFT. It is not enforced until a human activates it (see how_to_activate_policy).',\n inputSchema: {\n name: z.string().min(1).describe('Policy name (unique per org).'),\n spec: z\n .record(z.string(), z.unknown())\n .describe('Policy spec object: match + rules + defaults + controls.'),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ name, spec }) => jsonResult(await client.post('/v1/governance/policies', { name, spec })),\n );\n\n server.registerTool(\n 'install_template',\n {\n title: 'Install a governance policy template',\n description:\n 'Install a policy template as a new DRAFT policy. Activation remains a manual human step (see how_to_activate_policy).',\n inputSchema: {\n template_id: z.string().min(1).describe('The template id to install.'),\n name: z.string().min(1).describe('Name for the new draft policy.'),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ template_id, name }) =>\n jsonResult(await client.post(`/v1/governance/templates/${template_id}/install`, { name })),\n );\n }\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { PlatformClient } from '../client.js';\nimport { jsonResult, WRITE_ANNOTATIONS } from './shared.js';\n\n/**\n * Multimodal inference tools. These run real model calls that incur cost/usage,\n * so they are Write-tier — registered only when CENCORI_MCP_WRITE is set.\n *\n * NOTE: audio (text_to_speech / transcribe_audio) is intentionally not here yet\n * — those routes deal in binary / multipart bodies and need a binary-aware\n * client path. Tracked as a follow-up.\n */\n\nconst messageSchema = z\n .array(\n z.object({\n role: z.enum(['system', 'user', 'assistant']),\n content: z.string(),\n }),\n )\n .min(1)\n .describe('Chat messages in OpenAI format.');\n\nconst imageSourceShape = {\n image_url: z.string().url().optional().describe('Public URL of the image.'),\n image_base64: z.string().optional().describe('Base64-encoded image bytes (use with mime_type).'),\n mime_type: z.string().optional().describe('MIME type for image_base64, e.g. image/png.'),\n prompt: z.string().optional().describe('Optional instruction to steer the analysis.'),\n model: z.string().optional().describe('Override the model.'),\n};\n\nconst documentSourceShape = {\n document_url: z.string().url().optional().describe('Public URL of the PDF/image.'),\n document_base64: z.string().optional().describe('Base64-encoded document bytes (use with mime_type).'),\n mime_type: z.string().optional().describe('MIME type for document_base64, e.g. application/pdf.'),\n model: z.string().optional().describe('Override the model.'),\n};\n\nexport function registerMultimodalTools(server: McpServer, client: PlatformClient): void {\n server.registerTool(\n 'generate_text',\n {\n title: 'Generate text (chat completion)',\n description: 'Run a chat completion through the Cencori gateway. Incurs usage/cost.',\n inputSchema: {\n model: z.string().describe('Model id, e.g. llama-3.1-8b-instant or claude-opus-5.'),\n messages: messageSchema,\n temperature: z.number().min(0).max(2).optional(),\n max_tokens: z.number().int().positive().optional(),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ model, messages, temperature, max_tokens }) =>\n jsonResult(await client.post('/v1/chat/completions', { model, messages, temperature, max_tokens })),\n );\n\n server.registerTool(\n 'generate_rag',\n {\n title: 'RAG chat over a memory namespace',\n description: 'Answer a question grounded in stored memories for a namespace. Incurs usage/cost.',\n inputSchema: {\n model: z.string().describe('Model id for the answer.'),\n messages: messageSchema,\n namespace: z.string().min(1).describe('Memory namespace to retrieve context from.'),\n limit: z.number().int().positive().optional().describe('Max memories to retrieve.'),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ model, messages, namespace, limit }) =>\n jsonResult(await client.post('/ai/rag', { model, messages, namespace, limit })),\n );\n\n server.registerTool(\n 'create_embeddings',\n {\n title: 'Create embeddings',\n description: 'Generate vector embeddings for text. Incurs usage/cost.',\n inputSchema: {\n input: z.union([z.string(), z.array(z.string())]).describe('Text or array of texts to embed.'),\n model: z.string().optional().describe('Embedding model. Defaults to text-embedding-3-small.'),\n dimensions: z.number().int().positive().optional(),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ input, model, dimensions }) =>\n jsonResult(await client.post('/ai/embeddings', { input, model, dimensions })),\n );\n\n server.registerTool(\n 'moderate_content',\n {\n title: 'Moderate content',\n description: 'Classify text for policy violations via the moderation endpoint.',\n inputSchema: {\n input: z.union([z.string(), z.array(z.string())]).describe('Text or array of texts to moderate.'),\n model: z.string().optional(),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ input, model }) => jsonResult(await client.post('/ai/moderation', { input, model })),\n );\n\n server.registerTool(\n 'generate_image',\n {\n title: 'Generate an image',\n description: 'Generate image(s) from a text prompt. Incurs usage/cost.',\n inputSchema: {\n prompt: z.string().min(1).describe('Text prompt describing the image.'),\n model: z.string().optional(),\n n: z.number().int().positive().optional().describe('Number of images.'),\n size: z.string().optional().describe('Image size, e.g. 1024x1024.'),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ prompt, model, n, size }) =>\n jsonResult(await client.post('/ai/images/generate', { prompt, model, n, size })),\n );\n\n // ── Vision ───────────────────────────────────────────────────────────\n for (const [name, path, title] of [\n ['describe_image', '/ai/vision/describe', 'Describe an image'],\n ['ocr_image', '/ai/vision/ocr', 'Extract text from an image (OCR)'],\n ['classify_image', '/ai/vision/classify', 'Classify an image (JSON tags)'],\n ] as const) {\n server.registerTool(\n name,\n {\n title,\n description: `${title} via the Cencori vision endpoint. Incurs usage/cost.`,\n inputSchema: imageSourceShape,\n annotations: WRITE_ANNOTATIONS,\n },\n async (args) => jsonResult(await client.post(path, args)),\n );\n }\n\n // ── Documents ────────────────────────────────────────────────────────\n server.registerTool(\n 'extract_document',\n {\n title: 'Extract text from a document',\n description: 'Extract clean text from a PDF or image (native extraction for text PDFs). Incurs usage/cost for OCR.',\n inputSchema: documentSourceShape,\n annotations: WRITE_ANNOTATIONS,\n },\n async (args) => jsonResult(await client.post('/ai/documents/extract', args)),\n );\n server.registerTool(\n 'summarize_document',\n {\n title: 'Summarize a document',\n description: 'Extract and summarize a PDF or image. Incurs usage/cost.',\n inputSchema: { ...documentSourceShape, prompt: z.string().optional().describe('Optional summary instruction.') },\n annotations: WRITE_ANNOTATIONS,\n },\n async (args) => jsonResult(await client.post('/ai/documents/summarize', args)),\n );\n server.registerTool(\n 'query_document',\n {\n title: 'Ask a question about a document',\n description: 'Extract a document and answer a question about it. Incurs usage/cost.',\n inputSchema: {\n ...documentSourceShape,\n question: z.string().min(1).describe('The question to answer about the document.'),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async (args) => jsonResult(await client.post('/ai/documents/query', args)),\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { jsonResult, READ_ONLY_ANNOTATIONS } from './shared.js';\n\n/**\n * Guidance (\"how_to_*\") tools for MANUAL-ONLY actions.\n *\n * These are security- or account-sensitive actions the MCP must NEVER perform\n * on the user's behalf — API keys, governance activation, billing, and access\n * changes. Instead each tool returns human steps + the exact dashboard URL so\n * the agent can tell the user to do it themselves. All read-only, always\n * available (no API key or capability flag required).\n */\n\nconst orgProjectShape = {\n org_slug: z.string().min(1).optional().describe('Your organization slug, to build an exact dashboard link.'),\n project_slug: z.string().min(1).optional().describe('Your project slug, to build an exact dashboard link.'),\n};\n\ntype SlugArgs = { org_slug?: string; project_slug?: string };\n\nfunction registerGuide(\n server: McpServer,\n name: string,\n title: string,\n description: string,\n buildPath: (args: SlugArgs) => string,\n steps: string[],\n baseUrl: string,\n): void {\n server.registerTool(\n name,\n {\n title,\n description,\n inputSchema: orgProjectShape,\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async (args: SlugArgs) => {\n return jsonResult({\n manual_action: true,\n note: 'This action is intentionally not automated. Tell the user to complete it themselves in the Cencori dashboard.',\n steps,\n dashboard_url: `${baseUrl}${buildPath(args)}`,\n });\n },\n );\n}\n\nconst ORG = (s: SlugArgs) => s.org_slug ?? '<your-org>';\nconst PROJ = (s: SlugArgs) => s.project_slug ?? '<your-project>';\n\nexport function registerGuidanceTools(server: McpServer, baseUrl: string): void {\n // ── API keys ──────────────────────────────────────────────────────────\n registerGuide(\n server,\n 'how_to_create_api_key',\n 'How to create a Cencori API key',\n 'Steps for the USER to create a Cencori project API key. The MCP never creates keys.',\n (s) => `/${ORG(s)}/${PROJ(s)}/api-keys`,\n [\n 'Open the Cencori dashboard and select your organization, then your project.',\n 'Go to the project’s API Keys page.',\n 'Click “Create key”, name it, choose the environment, and copy the `csk_...` secret.',\n 'Store it server-side as CENCORI_API_KEY — it is shown only once.',\n ],\n baseUrl,\n );\n registerGuide(\n server,\n 'how_to_edit_api_key',\n 'How to edit a Cencori API key',\n 'Steps for the USER to rename or change scopes/limits on an API key. The MCP never edits keys.',\n (s) => `/${ORG(s)}/${PROJ(s)}/api-keys`,\n [\n 'Open the project’s API Keys page in the dashboard.',\n 'Find the key and open its actions menu.',\n 'Update its name, environment, or limits and save.',\n ],\n baseUrl,\n );\n registerGuide(\n server,\n 'how_to_revoke_api_key',\n 'How to revoke a Cencori API key',\n 'Steps for the USER to revoke/rotate an API key. The MCP never revokes keys.',\n (s) => `/${ORG(s)}/${PROJ(s)}/api-keys`,\n [\n 'Open the project’s API Keys page in the dashboard.',\n 'Find the key to revoke and choose “Revoke”. This immediately invalidates it.',\n 'If rotating, create a new key first and update CENCORI_API_KEY before revoking the old one.',\n ],\n baseUrl,\n );\n\n // ── Governance (human/checker steps) ──────────────────────────────────\n registerGuide(\n server,\n 'how_to_activate_policy',\n 'How to activate a governance policy',\n 'Steps for the USER to activate/retire a governance policy. Activation is a maker-checker human step — the MCP can draft a policy but never activates one.',\n (s) => `/${ORG(s)}/~/governance`,\n [\n 'Open the Governance page for your organization in the dashboard.',\n 'Find the draft (or pending-review) policy version.',\n 'Review it and, as an authorized checker, activate it. Exactly one version per policy can be active.',\n ],\n baseUrl,\n );\n registerGuide(\n server,\n 'how_to_respond_to_change_request',\n 'How to respond to a governance change request',\n 'Steps for the USER (as checker) to approve or reject a governance change request. The MCP never approves/rejects on the user’s behalf.',\n (s) => `/${ORG(s)}/~/governance`,\n [\n 'Open the Governance page and go to Change Requests.',\n 'Open the pending request and review the proposed change.',\n 'As an authorized checker, approve or reject it.',\n ],\n baseUrl,\n );\n\n // ── Billing ───────────────────────────────────────────────────────────\n registerGuide(\n server,\n 'how_to_change_plan',\n 'How to change your Cencori plan',\n 'Steps for the USER to change plan/tier. The MCP never changes plans or charges.',\n (s) => `/${ORG(s)}/~/billing`,\n [\n 'Open the Billing page for your organization in the dashboard.',\n 'Choose the plan you want and confirm the change.',\n ],\n baseUrl,\n );\n registerGuide(\n server,\n 'how_to_manage_billing',\n 'How to manage billing, payment methods, and credits',\n 'Steps for the USER to update payment methods or buy credits. The MCP never manages payment or credits.',\n (s) => `/${ORG(s)}/~/billing`,\n [\n 'Open the Billing page for your organization in the dashboard.',\n 'Update a payment method, or purchase credits, from the billing controls.',\n ],\n baseUrl,\n );\n\n // ── Access / members ──────────────────────────────────────────────────\n registerGuide(\n server,\n 'how_to_manage_members',\n 'How to manage members, roles, and SSO',\n 'Steps for the USER to invite/remove members, change roles, or configure SSO. The MCP never alters access.',\n (s) => `/${ORG(s)}/~/teams`,\n [\n 'Open the Teams page for your organization in the dashboard.',\n 'Invite or remove members, or change a member’s role.',\n 'Configure SSO from the organization settings if applicable.',\n ],\n baseUrl,\n );\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z","z","z","z","z","z","z"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/server.ts","../src/http.ts","../src/client.ts","../src/docs/client.ts","../src/tools/docs.ts","../src/tools/shared.ts","../src/tools/gateway.ts","../src/tools/agents.ts","../src/tools/memory.ts","../src/tools/sessions.ts","../src/tools/governance.ts","../src/tools/multimodal.ts","../src/tools/audio.ts","../src/tools/guidance.ts"],"sourcesContent":["import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { loadConfig } from './config.js';\nimport { createServer } from './server.js';\n\nasync function main(): Promise<void> {\n const config = loadConfig();\n const server = createServer(config);\n const transport = new StdioServerTransport();\n\n await server.connect(transport);\n const enabledFeatures = Object.entries(config.features)\n .filter(([, enabled]) => enabled)\n .map(([feature]) => feature)\n .join(', ');\n\n const tier = config.capabilities.destructive\n ? 'read+write+destructive'\n : config.capabilities.write\n ? 'read+write'\n : 'read-only';\n\n console.error(\n `Cencori MCP server running (tier=${tier}, base=${config.baseUrl}, features=${enabledFeatures}, apiKey=${config.apiKey ? 'configured' : 'not set'})`,\n );\n}\n\nmain().catch((error) => {\n console.error('Fatal error:', error);\n process.exit(1);\n});\n","const DEFAULT_BASE_URL = 'https://cencori.com';\n\nexport type McpFeature =\n | 'docs'\n | 'gateway'\n | 'agents'\n | 'memory'\n | 'sessions'\n | 'multimodal'\n | 'governance'\n | 'guidance';\n\nconst KNOWN_FEATURES: readonly McpFeature[] = [\n 'docs',\n 'gateway',\n 'agents',\n 'memory',\n 'sessions',\n 'multimodal',\n 'governance',\n 'guidance',\n];\n\n/**\n * Action tiers the server is allowed to expose. Reads are always available\n * (given a key); writes and destructive actions are opt-in via env.\n */\nexport interface McpCapabilities {\n /** Non-destructive writes + inference. CENCORI_MCP_WRITE. */\n write: boolean;\n /** Deletes and approvals. CENCORI_MCP_DESTRUCTIVE (implies write). */\n destructive: boolean;\n}\n\nexport interface McpConfig {\n docsBaseUrl: string;\n baseUrl: string;\n apiKey?: string;\n capabilities: McpCapabilities;\n features: Record<McpFeature, boolean>;\n}\n\nfunction normalizeBaseUrl(value: string): string {\n return value.replace(/\\/$/, '');\n}\n\nfunction parseBooleanEnv(value: string | undefined, defaultValue: boolean): boolean {\n if (value === undefined) {\n return defaultValue;\n }\n\n return !['0', 'false', 'no', 'off'].includes(value.trim().toLowerCase());\n}\n\nfunction isMcpFeature(value: string): value is McpFeature {\n return (KNOWN_FEATURES as readonly string[]).includes(value);\n}\n\nfunction allFeaturesEnabled(): Record<McpFeature, boolean> {\n return {\n docs: true,\n gateway: true,\n agents: true,\n memory: true,\n sessions: true,\n multimodal: true,\n governance: true,\n guidance: true,\n };\n}\n\nfunction parseFeatures(value: string | undefined): Record<McpFeature, boolean> {\n if (!value || value.trim() === '') {\n return allFeaturesEnabled();\n }\n\n const tokens = value\n .split(',')\n .map((feature) => feature.trim().toLowerCase())\n .filter(Boolean);\n\n const unrecognized = tokens.filter((token) => !isMcpFeature(token));\n if (unrecognized.length > 0) {\n console.error(\n `[cencori-mcp] Ignoring unrecognized CENCORI_MCP_FEATURES value(s): ${unrecognized.join(', ')}. ` +\n `Known features: ${KNOWN_FEATURES.join(', ')}.`,\n );\n }\n\n const enabled = new Set(tokens.filter(isMcpFeature));\n\n return {\n docs: enabled.has('docs'),\n gateway: enabled.has('gateway'),\n agents: enabled.has('agents'),\n memory: enabled.has('memory'),\n sessions: enabled.has('sessions'),\n multimodal: enabled.has('multimodal'),\n governance: enabled.has('governance'),\n guidance: enabled.has('guidance'),\n };\n}\n\nexport function loadConfig(): McpConfig {\n const docsBaseUrl = normalizeBaseUrl(process.env.CENCORI_DOCS_BASE_URL ?? DEFAULT_BASE_URL);\n const baseUrl = normalizeBaseUrl(process.env.CENCORI_BASE_URL ?? DEFAULT_BASE_URL);\n const apiKey = process.env.CENCORI_API_KEY?.trim() || undefined;\n const features = parseFeatures(process.env.CENCORI_MCP_FEATURES);\n\n // Destructive implies write. Both default off — reads-only unless opted in.\n const destructive = parseBooleanEnv(process.env.CENCORI_MCP_DESTRUCTIVE, false);\n const write = destructive || parseBooleanEnv(process.env.CENCORI_MCP_WRITE, false);\n\n return {\n docsBaseUrl,\n baseUrl,\n apiKey,\n capabilities: { write, destructive },\n features,\n };\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { PlatformClient } from './client.js';\nimport { DocsClient } from './docs/client.js';\nimport type { McpConfig } from './config.js';\nimport {\n registerAgentsTools,\n registerAudioTools,\n registerDocsTools,\n registerGatewayTools,\n registerGovernanceTools,\n registerGuidanceTools,\n registerMemoryTools,\n registerMultimodalTools,\n registerSessionsTools,\n} from './tools.js';\n\nconst SERVER_NAME = 'cencori';\nconst SERVER_VERSION = '0.6.0';\n\nexport function createServer(config: McpConfig): McpServer {\n const server = new McpServer(\n {\n name: SERVER_NAME,\n version: SERVER_VERSION,\n websiteUrl: 'https://cencori.com/docs',\n },\n {\n capabilities: {\n tools: {},\n },\n },\n );\n\n const { features, capabilities } = config;\n\n // Docs + guidance need no API key.\n if (features.docs) {\n const docs = new DocsClient(config.docsBaseUrl);\n registerDocsTools(server, docs, config.docsBaseUrl);\n }\n if (features.guidance) {\n registerGuidanceTools(server, config.baseUrl);\n }\n\n // Everything else needs a key. Reads register whenever a key is present;\n // multimodal inference is Write-tier (incurs cost) so it needs the flag.\n if (config.apiKey) {\n const client = new PlatformClient(config.baseUrl, config.apiKey);\n\n if (features.gateway) registerGatewayTools(server, client);\n if (features.agents) registerAgentsTools(server, client, capabilities);\n if (features.memory) registerMemoryTools(server, client, capabilities);\n if (features.sessions) registerSessionsTools(server, client, capabilities);\n if (features.governance) registerGovernanceTools(server, client, capabilities);\n\n if (features.multimodal && capabilities.write) {\n registerMultimodalTools(server, client);\n registerAudioTools(server, client);\n }\n }\n\n return server;\n}\n","/** Default timeout for outbound MCP → Cencori HTTP calls. */\nexport const FETCH_TIMEOUT_MS = 15_000;\n\nexport function fetchSignal(): AbortSignal {\n return AbortSignal.timeout(FETCH_TIMEOUT_MS);\n}\n\n/**\n * Extract a useful error message from a failed HTTP response.\n * Prefers JSON `error` / `error.message` over bare statusText.\n */\nexport async function readHttpErrorMessage(response: Response): Promise<string> {\n const errorData = (await response.json().catch(() => null)) as\n | { error?: string | { message?: string; code?: string } }\n | null;\n\n if (typeof errorData?.error === 'string') {\n return errorData.error;\n }\n\n if (errorData?.error && typeof errorData.error === 'object' && errorData.error.message) {\n return errorData.error.message;\n }\n\n return response.statusText || `HTTP ${response.status}`;\n}\n","import { fetchSignal, readHttpErrorMessage } from './http.js';\n\nexport type MetricsPeriod = '1h' | '24h' | '7d' | '30d' | 'mtd';\n\nexport interface AgentConfig {\n model: string | null;\n system_prompt: string | null;\n tools: string[];\n temperature: number | null;\n}\n\nexport interface Agent {\n id: string;\n name: string;\n description: string | null;\n is_active: boolean;\n shadow_mode: boolean;\n created_at: string;\n updated_at?: string;\n config: AgentConfig;\n}\n\nexport interface AgentListItem {\n id: string;\n name: string;\n description: string | null;\n is_active: boolean;\n shadow_mode: boolean;\n created_at: string;\n}\n\nexport interface ModelListResponse {\n object: 'list';\n data: Array<{\n id: string;\n object: 'model';\n created: number;\n owned_by: string;\n name?: string;\n type?: string | string[];\n context_window?: number;\n description?: string;\n }>;\n providers?: Array<{\n id: string;\n name: string;\n model_count: number;\n }>;\n}\n\nexport interface MetricsResponse {\n period: string;\n start_date: string;\n end_date: string;\n requests: {\n total: number;\n success: number;\n error: number;\n filtered: number;\n success_rate: number;\n };\n cost: {\n total_usd: number;\n average_per_request_usd: number;\n };\n tokens: {\n prompt: number;\n completion: number;\n total: number;\n };\n latency: {\n avg_ms: number;\n p50_ms: number | null;\n p90_ms: number | null;\n p99_ms: number | null;\n };\n providers: Record<string, { requests: number; cost_usd: number }>;\n models: Record<string, { requests: number; cost_usd: number }>;\n}\n\nexport type HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE';\n\nexport interface RequestOptions {\n searchParams?: Record<string, string | undefined>;\n body?: unknown;\n}\n\nexport class PlatformClient {\n constructor(\n private readonly baseUrl: string,\n private readonly apiKey: string,\n ) {}\n\n /**\n * Low-level request against the Cencori API. Sends `Authorization: Bearer`,\n * which the gateway accepts for both `/v1/*` and `/api/ai/*` routes.\n */\n async request<T = unknown>(method: HttpMethod, path: string, options: RequestOptions = {}): Promise<T> {\n const url = new URL(`/api${path}`, this.baseUrl);\n\n if (options.searchParams) {\n for (const [key, value] of Object.entries(options.searchParams)) {\n if (value !== undefined) {\n url.searchParams.set(key, value);\n }\n }\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n };\n const init: RequestInit = { method, headers, signal: fetchSignal() };\n\n if (options.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n init.body = JSON.stringify(options.body);\n }\n\n const response = await fetch(url, init);\n\n if (!response.ok) {\n const message = await readHttpErrorMessage(response);\n throw new Error(`Cencori API error: ${message}`);\n }\n\n // Some routes (e.g. DELETE) may return an empty body.\n const text = await response.text();\n if (!text) {\n return undefined as T;\n }\n return JSON.parse(text) as T;\n }\n\n get<T = unknown>(path: string, searchParams?: Record<string, string | undefined>): Promise<T> {\n return this.request<T>('GET', path, { searchParams });\n }\n\n post<T = unknown>(path: string, body?: unknown, searchParams?: Record<string, string | undefined>): Promise<T> {\n return this.request<T>('POST', path, { body, searchParams });\n }\n\n patch<T = unknown>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('PATCH', path, { body });\n }\n\n del<T = unknown>(path: string): Promise<T> {\n return this.request<T>('DELETE', path);\n }\n\n /** POST JSON and read a BINARY response (e.g. TTS audio). Returns base64 + mime. */\n async postBinary(path: string, body: unknown): Promise<{ base64: string; mimeType: string }> {\n const url = new URL(`/api${path}`, this.baseUrl);\n const response = await fetch(url, {\n method: 'POST',\n headers: { Authorization: `Bearer ${this.apiKey}`, 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: fetchSignal(),\n });\n if (!response.ok) {\n throw new Error(`Cencori API error: ${await readHttpErrorMessage(response)}`);\n }\n const mimeType = response.headers.get('content-type')?.split(';')[0]?.trim() || 'application/octet-stream';\n const buf = Buffer.from(await response.arrayBuffer());\n return { base64: buf.toString('base64'), mimeType };\n }\n\n /** POST multipart/form-data (e.g. STT audio upload). Let fetch set the boundary. */\n async postForm<T = unknown>(path: string, form: FormData): Promise<T> {\n const url = new URL(`/api${path}`, this.baseUrl);\n const response = await fetch(url, {\n method: 'POST',\n headers: { Authorization: `Bearer ${this.apiKey}` },\n body: form,\n signal: fetchSignal(),\n });\n if (!response.ok) {\n throw new Error(`Cencori API error: ${await readHttpErrorMessage(response)}`);\n }\n const text = await response.text();\n return (text ? JSON.parse(text) : undefined) as T;\n }\n\n listModels(): Promise<ModelListResponse> {\n return this.get<ModelListResponse>('/v1/models');\n }\n\n getMetrics(period: MetricsPeriod = '7d'): Promise<MetricsResponse> {\n return this.get<MetricsResponse>('/v1/metrics', { period });\n }\n\n listAgents(): Promise<{ data: AgentListItem[] }> {\n return this.get<{ data: AgentListItem[] }>('/v1/agents');\n }\n\n getAgent(agentId: string): Promise<Agent> {\n return this.get<Agent>(`/v1/agents/${agentId}`);\n }\n}\n","import type {\n DocNavigationResponse,\n DocRawResponse,\n DocSearchResponse,\n} from './types.js';\nimport { fetchSignal, readHttpErrorMessage } from '../http.js';\n\nexport class DocsClient {\n constructor(private readonly baseUrl: string) {}\n\n async search(query: string): Promise<DocSearchResponse> {\n const url = new URL('/api/docs/search', this.baseUrl);\n url.searchParams.set('q', query);\n\n const response = await fetch(url, { signal: fetchSignal() });\n if (!response.ok) {\n const message = await readHttpErrorMessage(response);\n throw new Error(`Docs search failed (${response.status}): ${message}`);\n }\n\n return response.json() as Promise<DocSearchResponse>;\n }\n\n async getDoc(slug: string): Promise<DocRawResponse> {\n const normalizedSlug = slug.replace(/^\\/docs\\//, '').replace(/^\\//, '');\n const url = new URL('/api/docs/raw', this.baseUrl);\n url.searchParams.set('slug', normalizedSlug);\n\n const response = await fetch(url, { signal: fetchSignal() });\n if (response.status === 404) {\n return { content: '', error: `Document not found: ${normalizedSlug}` };\n }\n if (!response.ok) {\n const message = await readHttpErrorMessage(response);\n throw new Error(`Docs fetch failed (${response.status}): ${message}`);\n }\n\n return response.json() as Promise<DocRawResponse>;\n }\n\n async listNavigation(): Promise<DocNavigationResponse> {\n const url = new URL('/api/docs/navigation', this.baseUrl);\n const response = await fetch(url, { signal: fetchSignal() });\n if (!response.ok) {\n const message = await readHttpErrorMessage(response);\n throw new Error(`Docs navigation failed (${response.status}): ${message}`);\n }\n\n return response.json() as Promise<DocNavigationResponse>;\n }\n\n /** Fetch the raw `llm.txt` integration contract (public, no auth). */\n async getIntegrationGuide(): Promise<string> {\n const url = new URL('/llm.txt', this.baseUrl);\n const response = await fetch(url, { signal: fetchSignal() });\n if (!response.ok) {\n const message = await readHttpErrorMessage(response);\n throw new Error(`Integration guide fetch failed (${response.status}): ${message}`);\n }\n return response.text();\n }\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { DocsClient } from '../docs/client.js';\nimport { jsonResult, READ_ONLY_ANNOTATIONS } from './shared.js';\n\nexport function registerDocsTools(server: McpServer, docs: DocsClient, docsBaseUrl: string): void {\n server.registerTool(\n 'search_docs',\n {\n title: 'Search Cencori docs',\n description:\n 'Search Cencori documentation by keyword. Returns matching pages with title, section, URL, and snippet.',\n inputSchema: {\n query: z\n .string()\n .min(2)\n .describe('Search query (minimum 2 characters). Example: \"rate limiting\", \"api keys\", \"failover\".'),\n },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ query }) => {\n const { results } = await docs.search(query);\n return jsonResult({ query, count: results.length, results });\n },\n );\n\n server.registerTool(\n 'get_doc',\n {\n title: 'Get Cencori doc page',\n description:\n 'Fetch the raw markdown content of a Cencori documentation page by slug. Example slugs: \"quick-start\", \"ai/sdk\", \"api/chat\".',\n inputSchema: {\n slug: z\n .string()\n .min(1)\n .describe('Doc slug without /docs/ prefix. Example: \"ai/gateway\" or \"security/scan\".'),\n },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ slug }) => {\n const doc = await docs.getDoc(slug);\n const normalizedSlug = slug.replace(/^\\/docs\\//, '').replace(/^\\//, '');\n\n if (doc.error) {\n return jsonResult({ slug: normalizedSlug, error: doc.error });\n }\n\n return jsonResult({\n slug: normalizedSlug,\n url: `${docsBaseUrl}/docs/${normalizedSlug}`,\n content: doc.content,\n });\n },\n );\n\n server.registerTool(\n 'list_docs',\n {\n title: 'List Cencori docs',\n description:\n 'List the Cencori documentation table of contents grouped by section (Getting Started, Platform, AI, API Reference, etc.).',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => {\n const navigation = await docs.listNavigation();\n return jsonResult(navigation);\n },\n );\n\n server.registerTool(\n 'get_integration_guide',\n {\n title: 'Get the Cencori integration guide (llm.txt)',\n description:\n 'Fetch the full Cencori \"Integration Contract for Code Agents\" (llm.txt) — the authoritative, always-current guide for setting up Cencori in a codebase: package names, import paths, env vars, base URLs, SDK usage, request/response shapes, and step-by-step setup. Call this FIRST when asked to add, integrate, or set up Cencori in a project.',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => {\n const guide = await docs.getIntegrationGuide();\n return {\n content: [\n {\n type: 'text' as const,\n text: `Source: ${docsBaseUrl}/llm.txt\\n\\n${guide}`,\n },\n ],\n };\n },\n );\n}\n","export const READ_ONLY_ANNOTATIONS = {\n title: 'Read-only',\n readOnlyHint: true,\n destructiveHint: false,\n openWorldHint: false,\n} as const;\n\n/**\n * Non-destructive write / action (create, run inference). Mutates state or\n * incurs cost but does not delete or irreversibly change existing resources.\n * Gated behind CENCORI_MCP_WRITE.\n */\nexport const WRITE_ANNOTATIONS = {\n title: 'Write',\n readOnlyHint: false,\n destructiveHint: false,\n openWorldHint: false,\n} as const;\n\n/**\n * Destructive action (delete, approve/reject). Gated behind\n * CENCORI_MCP_DESTRUCTIVE. Clients should surface a confirmation.\n */\nexport const DESTRUCTIVE_ANNOTATIONS = {\n title: 'Destructive',\n readOnlyHint: false,\n destructiveHint: true,\n openWorldHint: false,\n} as const;\n\nexport function jsonResult(data: unknown) {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { PlatformClient, MetricsPeriod } from '../client.js';\nimport { jsonResult, READ_ONLY_ANNOTATIONS } from './shared.js';\n\nexport function registerGatewayTools(server: McpServer, client: PlatformClient): void {\n server.registerTool(\n 'list_models',\n {\n title: 'List Cencori gateway models',\n description: 'List models available through the Cencori gateway for the authenticated project.',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => {\n const models = await client.listModels();\n return jsonResult(models);\n },\n );\n\n server.registerTool(\n 'get_metrics',\n {\n title: 'Get Cencori gateway metrics',\n description:\n 'Get gateway usage metrics for the authenticated project, including requests, cost, tokens, latency, and model/provider breakdowns.',\n inputSchema: {\n period: z\n .enum(['1h', '24h', '7d', '30d', 'mtd'])\n .optional()\n .describe('Metrics time window. Allowed values: 1h, 24h, 7d, 30d, mtd.'),\n },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ period }) => {\n const metrics = await client.getMetrics(period as MetricsPeriod | undefined);\n return jsonResult(metrics);\n },\n );\n\n server.registerTool(\n 'get_health',\n {\n title: 'Get Cencori gateway health',\n description: 'Check gateway/platform health for the authenticated project.',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => jsonResult(await client.get('/v1/health')),\n );\n\n server.registerTool(\n 'check_quota',\n {\n title: 'Check billing quota',\n description: 'Check remaining quota/credits and usage limits for the authenticated project.',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => jsonResult(await client.get('/v1/billing/check-quota')),\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { PlatformClient } from '../client.js';\nimport type { McpCapabilities } from '../config.js';\nimport { jsonResult, READ_ONLY_ANNOTATIONS, WRITE_ANNOTATIONS, DESTRUCTIVE_ANNOTATIONS } from './shared.js';\n\nconst agentConfigShape = z\n .object({\n model: z.string().optional(),\n system_prompt: z.string().optional(),\n tools: z.array(z.string()).optional(),\n temperature: z.number().min(0).max(2).optional(),\n })\n .optional()\n .describe('Agent runtime config: model, system_prompt, tools, temperature.');\n\nexport function registerAgentsTools(server: McpServer, client: PlatformClient, caps: McpCapabilities): void {\n server.registerTool(\n 'list_agents',\n {\n title: 'List Cencori agents',\n description: 'List agents available to the authenticated project.',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => {\n const agents = await client.listAgents();\n return jsonResult(agents);\n },\n );\n\n server.registerTool(\n 'get_agent',\n {\n title: 'Get Cencori agent',\n description: 'Fetch the full configuration for one Cencori agent by ID.',\n inputSchema: {\n agent_id: z.string().min(1).describe('The agent ID to fetch.'),\n },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ agent_id }) => {\n const agent = await client.getAgent(agent_id);\n return jsonResult(agent);\n },\n );\n\n server.registerTool(\n 'poll_agent_actions',\n {\n title: 'Poll pending agent actions',\n description: 'Poll for pending actions queued for agents in the authenticated project.',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => jsonResult(await client.get('/v1/agent/actions/poll')),\n );\n\n if (caps.write) {\n server.registerTool(\n 'create_agent',\n {\n title: 'Create an agent',\n description: 'Create a new agent in a project.',\n inputSchema: {\n project_id: z.string().min(1).describe('The project id to create the agent in.'),\n name: z.string().min(1).describe('Agent name.'),\n description: z.string().optional(),\n config: agentConfigShape,\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ project_id, name, description, config }) =>\n jsonResult(await client.post('/v1/agents', { project_id, name, description, config })),\n );\n\n server.registerTool(\n 'update_agent',\n {\n title: 'Update an agent',\n description: 'Update an agent’s name, description, status, shadow mode, or config.',\n inputSchema: {\n agent_id: z.string().min(1).describe('The agent id to update.'),\n name: z.string().optional(),\n description: z.string().optional(),\n is_active: z.boolean().optional(),\n shadow_mode: z.boolean().optional(),\n config: agentConfigShape,\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ agent_id, name, description, is_active, shadow_mode, config }) =>\n jsonResult(\n await client.patch(`/v1/agents/${agent_id}`, {\n name,\n description,\n is_active,\n shadow_mode,\n config,\n }),\n ),\n );\n }\n\n if (caps.destructive) {\n server.registerTool(\n 'delete_agent',\n {\n title: 'Delete an agent',\n description: 'Permanently delete an agent by id. This cannot be undone.',\n inputSchema: { agent_id: z.string().min(1).describe('The agent id to delete.') },\n annotations: DESTRUCTIVE_ANNOTATIONS,\n },\n async ({ agent_id }) => jsonResult(await client.del(`/v1/agents/${agent_id}`)),\n );\n }\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { PlatformClient } from '../client.js';\nimport type { McpCapabilities } from '../config.js';\nimport { jsonResult, READ_ONLY_ANNOTATIONS, WRITE_ANNOTATIONS, DESTRUCTIVE_ANNOTATIONS } from './shared.js';\n\n/**\n * Memory tools. Reads are always registered; writes need CENCORI_MCP_WRITE and\n * deletes need CENCORI_MCP_DESTRUCTIVE.\n *\n * Memory is scoped to a user or a session (the only scopes today). Scoped tools\n * therefore require `user_id` (user scope, the default) or `session_id`\n * (session scope) — a bare call has no scope key and the API rejects it.\n */\n\nconst scopeShape = {\n namespace: z.string().optional().describe('Memory namespace to scope to.'),\n scope: z.enum(['user', 'session']).optional().describe('Memory scope. Defaults to \"user\".'),\n user_id: z.string().optional().describe('End-user id. REQUIRED for user scope (the default).'),\n session_id: z.string().optional().describe('Session id. REQUIRED for session scope.'),\n};\n\ntype ScopeArgs = { scope?: 'user' | 'session'; user_id?: string; session_id?: string };\n\n/** Returns a clear error message if the required scope key is missing, else null. */\nfunction missingScopeKey({ scope, user_id, session_id }: ScopeArgs): string | null {\n if ((scope ?? 'user') === 'session') {\n return session_id || user_id ? null : 'session_id (or user_id) is required for session scope.';\n }\n return user_id\n ? null\n : 'user_id is required for user scope (the default). Pass user_id, or use scope=\"session\" with session_id.';\n}\n\nconst scopeErr = (msg: string) => jsonResult({ error: 'missing_scope', message: msg });\n\nexport function registerMemoryTools(server: McpServer, client: PlatformClient, caps: McpCapabilities): void {\n server.registerTool(\n 'list_memories',\n {\n title: 'List memories',\n description: 'List stored memories for a user or session. Requires user_id (or session_id for session scope).',\n inputSchema: {\n ...scopeShape,\n limit: z.number().int().positive().max(100).optional(),\n cursor: z.string().optional().describe('Pagination cursor from a previous response.'),\n },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ namespace, scope, user_id, session_id, limit, cursor }) => {\n const err = missingScopeKey({ scope, user_id, session_id });\n if (err) return scopeErr(err);\n return jsonResult(\n await client.get('/v1/memory/list', {\n namespace,\n scope,\n userId: user_id,\n sessionId: session_id,\n limit: limit?.toString(),\n cursor,\n }),\n );\n },\n );\n\n server.registerTool(\n 'search_memory',\n {\n title: 'Search memory (semantic)',\n description: 'Semantically search a user’s or session’s memories. Requires user_id (or session_id for session scope).',\n inputSchema: {\n query: z.string().min(1).describe('Natural-language search query.'),\n ...scopeShape,\n top_k: z.number().int().positive().max(100).optional().describe('Max results.'),\n threshold: z.number().min(0).max(1).optional().describe('Similarity threshold.'),\n },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ query, namespace, scope, user_id, session_id, top_k, threshold }) => {\n const err = missingScopeKey({ scope, user_id, session_id });\n if (err) return scopeErr(err);\n return jsonResult(\n await client.post('/v1/memory/search', {\n query,\n namespace,\n scope,\n userId: user_id,\n sessionId: session_id,\n topK: top_k,\n threshold,\n }),\n );\n },\n );\n\n server.registerTool(\n 'get_memory',\n {\n title: 'Get a memory',\n description: 'Fetch a single memory by id.',\n inputSchema: { memory_id: z.string().min(1).describe('The memory id.') },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ memory_id }) => jsonResult(await client.get(`/v1/memory/${memory_id}`)),\n );\n\n server.registerTool(\n 'list_memory_entities',\n {\n title: 'List memory entities',\n description: 'List entities resolved from a user’s or session’s memory graph. Requires user_id (or session_id).',\n inputSchema: scopeShape,\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ namespace, scope, user_id, session_id }) => {\n const err = missingScopeKey({ scope, user_id, session_id });\n if (err) return scopeErr(err);\n return jsonResult(\n await client.get('/v1/memory/entities', { namespace, scope, userId: user_id, sessionId: session_id }),\n );\n },\n );\n\n server.registerTool(\n 'get_memory_graph',\n {\n title: 'Get memory entity graph',\n description: 'Traverse a user’s or session’s memory entity graph. Requires user_id (or session_id).',\n inputSchema: {\n ...scopeShape,\n entity: z.string().optional().describe('Entity to start traversal from.'),\n hops: z.number().int().positive().max(5).optional().describe('Traversal depth.'),\n },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ namespace, scope, user_id, session_id, entity, hops }) => {\n const err = missingScopeKey({ scope, user_id, session_id });\n if (err) return scopeErr(err);\n return jsonResult(\n await client.get('/v1/memory/graph', {\n namespace,\n scope,\n userId: user_id,\n sessionId: session_id,\n entity,\n hops: hops?.toString(),\n }),\n );\n },\n );\n\n server.registerTool(\n 'get_forget_suggestions',\n {\n title: 'Get forget suggestions',\n description: 'List memories the system suggests forgetting for a user or session. Requires user_id (or session_id).',\n inputSchema: scopeShape,\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ namespace, scope, user_id, session_id }) => {\n const err = missingScopeKey({ scope, user_id, session_id });\n if (err) return scopeErr(err);\n return jsonResult(\n await client.get('/v1/memory/forget-suggestions', {\n namespace,\n scope,\n userId: user_id,\n sessionId: session_id,\n }),\n );\n },\n );\n\n if (caps.write) {\n server.registerTool(\n 'remember_memory',\n {\n title: 'Remember a conversation turn',\n description:\n 'Store a user/assistant exchange as memory. Requires user_id (or session_id for session scope).',\n inputSchema: {\n user: z.string().min(1).describe('The user message.'),\n assistant: z.string().min(1).describe('The assistant response.'),\n ...scopeShape,\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ user, assistant, namespace, scope, user_id, session_id }) => {\n const err = missingScopeKey({ scope, user_id, session_id });\n if (err) return scopeErr(err);\n return jsonResult(\n await client.post('/v1/memory/remember', {\n user,\n assistant,\n namespace,\n scope,\n userId: user_id,\n sessionId: session_id,\n }),\n );\n },\n );\n\n server.registerTool(\n 'write_memory',\n {\n title: 'Write a memory',\n description: 'Store a single memory (a fact/note). Requires user_id (or session_id for session scope).',\n inputSchema: {\n content: z.string().min(1).describe('The memory content to store.'),\n importance: z.number().min(0).max(1).optional().describe('Importance weight 0–1.'),\n ...scopeShape,\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ content, importance, namespace, scope, user_id, session_id }) => {\n const err = missingScopeKey({ scope, user_id, session_id });\n if (err) return scopeErr(err);\n return jsonResult(\n await client.post('/v1/memory/write', {\n content,\n importance,\n namespace,\n scope,\n userId: user_id,\n sessionId: session_id,\n }),\n );\n },\n );\n\n server.registerTool(\n 'create_namespace',\n {\n title: 'Create a memory namespace',\n description: 'Create a new memory namespace.',\n inputSchema: {\n name: z.string().min(1).describe('Namespace name.'),\n description: z.string().optional(),\n embedding_model: z.string().optional().describe('Embedding model for this namespace.'),\n dimensions: z.number().int().positive().optional(),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ name, description, embedding_model, dimensions }) =>\n jsonResult(\n await client.post('/memory/namespaces', {\n name,\n description,\n embeddingModel: embedding_model,\n dimensions,\n }),\n ),\n );\n }\n\n if (caps.destructive) {\n server.registerTool(\n 'delete_memory',\n {\n title: 'Delete a memory',\n description: 'Permanently delete a memory by id. This cannot be undone.',\n inputSchema: { memory_id: z.string().min(1).describe('The memory id to delete.') },\n annotations: DESTRUCTIVE_ANNOTATIONS,\n },\n async ({ memory_id }) => jsonResult(await client.del(`/v1/memory/${memory_id}`)),\n );\n }\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { PlatformClient } from '../client.js';\nimport type { McpCapabilities } from '../config.js';\nimport { jsonResult, READ_ONLY_ANNOTATIONS, WRITE_ANNOTATIONS, DESTRUCTIVE_ANNOTATIONS } from './shared.js';\n\n/**\n * Agent session tools. Reads always register; create/turn need\n * CENCORI_MCP_WRITE; delete/approve/reject need CENCORI_MCP_DESTRUCTIVE.\n */\nexport function registerSessionsTools(server: McpServer, client: PlatformClient, caps: McpCapabilities): void {\n server.registerTool(\n 'list_sessions',\n {\n title: 'List agent sessions',\n description: 'List agent sessions for the project, optionally filtered by status or agent.',\n inputSchema: {\n status: z.string().optional().describe('Filter by session status.'),\n agent_id: z.string().optional().describe('Filter by agent id.'),\n page: z.number().int().positive().optional(),\n limit: z.number().int().positive().max(100).optional(),\n },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ status, agent_id, page, limit }) =>\n jsonResult(\n await client.get('/v1/sessions', {\n status,\n agent_id,\n page: page?.toString(),\n limit: limit?.toString(),\n }),\n ),\n );\n\n server.registerTool(\n 'get_session',\n {\n title: 'Get an agent session',\n description: 'Fetch one agent session by id.',\n inputSchema: { session_id: z.string().min(1).describe('The session id.') },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ session_id }) => jsonResult(await client.get(`/v1/sessions/${session_id}`)),\n );\n\n server.registerTool(\n 'get_session_events',\n {\n title: 'Get agent session events',\n description: 'List the event timeline for one agent session.',\n inputSchema: { session_id: z.string().min(1).describe('The session id.') },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ session_id }) => jsonResult(await client.get(`/v1/sessions/${session_id}/events`)),\n );\n\n if (caps.write) {\n server.registerTool(\n 'create_session',\n {\n title: 'Create an agent session',\n description: 'Start a new session for an agent.',\n inputSchema: {\n agent_id: z.string().min(1).describe('The agent id to start a session for.'),\n metadata: z.record(z.string(), z.unknown()).optional().describe('Optional session metadata.'),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ agent_id, metadata }) => jsonResult(await client.post('/v1/sessions', { agent_id, metadata })),\n );\n\n server.registerTool(\n 'add_session_turn',\n {\n title: 'Add a turn to a session',\n description: 'Run a turn in an agent session. Incurs usage/cost.',\n inputSchema: {\n session_id: z.string().min(1).describe('The session id.'),\n model: z.string().min(1).describe('Model id for the turn.'),\n input: z.string().min(1).describe('The user input for this turn.'),\n instructions: z.string().optional().describe('Optional system instructions.'),\n temperature: z.number().min(0).max(2).optional(),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ session_id, model, input, instructions, temperature }) =>\n jsonResult(\n await client.post(`/v1/sessions/${session_id}/turns`, {\n model,\n input,\n instructions,\n temperature,\n }),\n ),\n );\n }\n\n if (caps.destructive) {\n server.registerTool(\n 'delete_session',\n {\n title: 'Delete an agent session',\n description: 'Permanently delete an agent session by id. This cannot be undone.',\n inputSchema: { session_id: z.string().min(1).describe('The session id to delete.') },\n annotations: DESTRUCTIVE_ANNOTATIONS,\n },\n async ({ session_id }) => jsonResult(await client.del(`/v1/sessions/${session_id}`)),\n );\n\n server.registerTool(\n 'approve_session',\n {\n title: 'Approve a pending session action',\n description: 'Approve a pending action in an agent session (human-in-the-loop).',\n inputSchema: {\n session_id: z.string().min(1).describe('The session id.'),\n action_id: z.string().optional().describe('Specific pending action id, if any.'),\n },\n annotations: DESTRUCTIVE_ANNOTATIONS,\n },\n async ({ session_id, action_id }) =>\n jsonResult(await client.post(`/v1/sessions/${session_id}/approve`, { action_id })),\n );\n\n server.registerTool(\n 'reject_session',\n {\n title: 'Reject a pending session action',\n description: 'Reject a pending action in an agent session (human-in-the-loop).',\n inputSchema: {\n session_id: z.string().min(1).describe('The session id.'),\n action_id: z.string().optional().describe('Specific pending action id, if any.'),\n },\n annotations: DESTRUCTIVE_ANNOTATIONS,\n },\n async ({ session_id, action_id }) =>\n jsonResult(await client.post(`/v1/sessions/${session_id}/reject`, { action_id })),\n );\n }\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { PlatformClient } from '../client.js';\nimport type { McpCapabilities } from '../config.js';\nimport { jsonResult, READ_ONLY_ANNOTATIONS, WRITE_ANNOTATIONS } from './shared.js';\n\n/**\n * Governance tools. Reads always register; maker/draft writes (create_policy,\n * install_template) need CENCORI_MCP_WRITE. Activation and change-request\n * responses stay MANUAL — see the how_to_* guidance tools. There is\n * deliberately no destructive governance tool.\n */\nexport function registerGovernanceTools(server: McpServer, client: PlatformClient, caps: McpCapabilities): void {\n server.registerTool(\n 'list_policies',\n {\n title: 'List governance policies',\n description: 'List governance policies for the org, optionally filtered by status.',\n inputSchema: {\n status: z.enum(['draft', 'pending_review', 'active', 'retired']).optional(),\n },\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async ({ status }) => jsonResult(await client.get('/v1/governance/policies', { status })),\n );\n\n server.registerTool(\n 'list_roles',\n {\n title: 'List governance roles',\n description: 'List governance roles defined for the org.',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => jsonResult(await client.get('/v1/governance/roles')),\n );\n\n server.registerTool(\n 'list_change_requests',\n {\n title: 'List governance change requests',\n description: 'List maker-checker change requests for governance policies.',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => jsonResult(await client.get('/v1/governance/change-requests')),\n );\n\n server.registerTool(\n 'get_governance_ledger',\n {\n title: 'Get governance audit ledger',\n description: 'Read the immutable governance audit ledger.',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => jsonResult(await client.get('/v1/governance/ledger')),\n );\n\n server.registerTool(\n 'get_governance_evidence',\n {\n title: 'Get governance evidence',\n description: 'Read governance evidence records (enforcement decisions).',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => jsonResult(await client.get('/v1/governance/evidence')),\n );\n\n server.registerTool(\n 'list_governance_templates',\n {\n title: 'List governance policy templates',\n description: 'List installable governance policy templates.',\n inputSchema: {},\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async () => jsonResult(await client.get('/v1/governance/templates')),\n );\n\n if (caps.write) {\n server.registerTool(\n 'create_policy',\n {\n title: 'Draft a governance policy',\n description:\n 'Create a governance policy as a DRAFT. It is not enforced until a human activates it (see how_to_activate_policy).',\n inputSchema: {\n name: z.string().min(1).describe('Policy name (unique per org).'),\n spec: z\n .record(z.string(), z.unknown())\n .describe('Policy spec object: match + rules + defaults + controls.'),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ name, spec }) => jsonResult(await client.post('/v1/governance/policies', { name, spec })),\n );\n\n server.registerTool(\n 'install_template',\n {\n title: 'Install a governance policy template',\n description:\n 'Install a policy template as a new DRAFT policy. Activation remains a manual human step (see how_to_activate_policy).',\n inputSchema: {\n template_id: z.string().min(1).describe('The template id to install.'),\n name: z.string().min(1).describe('Name for the new draft policy.'),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ template_id, name }) =>\n jsonResult(await client.post(`/v1/governance/templates/${template_id}/install`, { name })),\n );\n }\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { PlatformClient } from '../client.js';\nimport { jsonResult, WRITE_ANNOTATIONS } from './shared.js';\n\n/**\n * Multimodal inference tools. These run real model calls that incur cost/usage,\n * so they are Write-tier — registered only when CENCORI_MCP_WRITE is set.\n *\n * NOTE: audio (text_to_speech / transcribe_audio) is intentionally not here yet\n * — those routes deal in binary / multipart bodies and need a binary-aware\n * client path. Tracked as a follow-up.\n */\n\nconst messageSchema = z\n .array(\n z.object({\n role: z.enum(['system', 'user', 'assistant']),\n content: z.string(),\n }),\n )\n .min(1)\n .describe('Chat messages in OpenAI format.');\n\nconst imageSourceShape = {\n image_url: z.string().url().optional().describe('Public URL of the image.'),\n image_base64: z.string().optional().describe('Base64-encoded image bytes (use with mime_type).'),\n mime_type: z.string().optional().describe('MIME type for image_base64, e.g. image/png.'),\n prompt: z.string().optional().describe('Optional instruction to steer the analysis.'),\n model: z.string().optional().describe('Override the model.'),\n};\n\nconst documentSourceShape = {\n document_url: z.string().url().optional().describe('Public URL of the PDF/image.'),\n document_base64: z.string().optional().describe('Base64-encoded document bytes (use with mime_type).'),\n mime_type: z.string().optional().describe('MIME type for document_base64, e.g. application/pdf.'),\n model: z.string().optional().describe('Override the model.'),\n};\n\nexport function registerMultimodalTools(server: McpServer, client: PlatformClient): void {\n server.registerTool(\n 'generate_text',\n {\n title: 'Generate text (chat completion)',\n description: 'Run a chat completion through the Cencori gateway. Incurs usage/cost.',\n inputSchema: {\n model: z.string().describe('Model id, e.g. llama-3.1-8b-instant or claude-opus-5.'),\n messages: messageSchema,\n temperature: z.number().min(0).max(2).optional(),\n max_tokens: z.number().int().positive().optional(),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ model, messages, temperature, max_tokens }) =>\n jsonResult(await client.post('/v1/chat/completions', { model, messages, temperature, max_tokens })),\n );\n\n server.registerTool(\n 'generate_rag',\n {\n title: 'RAG chat over a memory namespace',\n description: 'Answer a question grounded in stored memories for a namespace. Incurs usage/cost.',\n inputSchema: {\n model: z.string().describe('Model id for the answer.'),\n messages: messageSchema,\n namespace: z.string().min(1).describe('Memory namespace to retrieve context from.'),\n limit: z.number().int().positive().optional().describe('Max memories to retrieve.'),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ model, messages, namespace, limit }) =>\n jsonResult(await client.post('/ai/rag', { model, messages, namespace, limit })),\n );\n\n server.registerTool(\n 'create_embeddings',\n {\n title: 'Create embeddings',\n description: 'Generate vector embeddings for text. Incurs usage/cost.',\n inputSchema: {\n input: z.union([z.string(), z.array(z.string())]).describe('Text or array of texts to embed.'),\n model: z.string().optional().describe('Embedding model. Defaults to text-embedding-3-small.'),\n dimensions: z.number().int().positive().optional(),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ input, model, dimensions }) =>\n jsonResult(await client.post('/ai/embeddings', { input, model, dimensions })),\n );\n\n server.registerTool(\n 'moderate_content',\n {\n title: 'Moderate content',\n description: 'Classify text for policy violations via the moderation endpoint.',\n inputSchema: {\n input: z.union([z.string(), z.array(z.string())]).describe('Text or array of texts to moderate.'),\n model: z.string().optional(),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ input, model }) => jsonResult(await client.post('/ai/moderation', { input, model })),\n );\n\n server.registerTool(\n 'generate_image',\n {\n title: 'Generate an image',\n description: 'Generate image(s) from a text prompt. Incurs usage/cost.',\n inputSchema: {\n prompt: z.string().min(1).describe('Text prompt describing the image.'),\n model: z.string().optional(),\n n: z.number().int().positive().optional().describe('Number of images.'),\n size: z.string().optional().describe('Image size, e.g. 1024x1024.'),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ prompt, model, n, size }) =>\n jsonResult(await client.post('/ai/images/generate', { prompt, model, n, size })),\n );\n\n // ── Vision ───────────────────────────────────────────────────────────\n for (const [name, path, title] of [\n ['describe_image', '/ai/vision/describe', 'Describe an image'],\n ['ocr_image', '/ai/vision/ocr', 'Extract text from an image (OCR)'],\n ['classify_image', '/ai/vision/classify', 'Classify an image (JSON tags)'],\n ] as const) {\n server.registerTool(\n name,\n {\n title,\n description: `${title} via the Cencori vision endpoint. Incurs usage/cost.`,\n inputSchema: imageSourceShape,\n annotations: WRITE_ANNOTATIONS,\n },\n async (args) => jsonResult(await client.post(path, args)),\n );\n }\n\n // ── Documents ────────────────────────────────────────────────────────\n server.registerTool(\n 'extract_document',\n {\n title: 'Extract text from a document',\n description: 'Extract clean text from a PDF or image (native extraction for text PDFs). Incurs usage/cost for OCR.',\n inputSchema: documentSourceShape,\n annotations: WRITE_ANNOTATIONS,\n },\n async (args) => jsonResult(await client.post('/ai/documents/extract', args)),\n );\n server.registerTool(\n 'summarize_document',\n {\n title: 'Summarize a document',\n description: 'Extract and summarize a PDF or image. Incurs usage/cost.',\n inputSchema: { ...documentSourceShape, prompt: z.string().optional().describe('Optional summary instruction.') },\n annotations: WRITE_ANNOTATIONS,\n },\n async (args) => jsonResult(await client.post('/ai/documents/summarize', args)),\n );\n server.registerTool(\n 'query_document',\n {\n title: 'Ask a question about a document',\n description: 'Extract a document and answer a question about it. Incurs usage/cost.',\n inputSchema: {\n ...documentSourceShape,\n question: z.string().min(1).describe('The question to answer about the document.'),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async (args) => jsonResult(await client.post('/ai/documents/query', args)),\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { PlatformClient } from '../client.js';\nimport { jsonResult, WRITE_ANNOTATIONS } from './shared.js';\n\n/**\n * Audio inference tools (Write-tier). TTS returns binary audio (surfaced as an\n * MCP audio content block); STT uploads audio as multipart/form-data. Both\n * incur usage/cost, so they register only when CENCORI_MCP_WRITE is set.\n */\nexport function registerAudioTools(server: McpServer, client: PlatformClient): void {\n server.registerTool(\n 'text_to_speech',\n {\n title: 'Text to speech',\n description: 'Synthesize speech from text. Returns audio. Incurs usage/cost.',\n inputSchema: {\n input: z.string().min(1).describe('The text to speak.'),\n model: z.string().optional().describe('TTS model. Defaults to tts-1.'),\n voice: z.string().optional().describe('Voice id/name (provider-specific).'),\n response_format: z.string().optional().describe('Audio format, e.g. mp3, wav, opus.'),\n provider: z.string().optional().describe('Override the TTS provider.'),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ input, model, voice, response_format, provider }) => {\n const { base64, mimeType } = await client.postBinary('/ai/audio/speech', {\n input,\n model,\n voice,\n response_format,\n provider,\n });\n return {\n content: [\n { type: 'audio' as const, data: base64, mimeType },\n { type: 'text' as const, text: `Synthesized ${input.length} chars → ${mimeType} (${base64.length} b64 bytes).` },\n ],\n };\n },\n );\n\n server.registerTool(\n 'transcribe_audio',\n {\n title: 'Transcribe audio (speech to text)',\n description: 'Transcribe base64-encoded audio to text. Incurs usage/cost.',\n inputSchema: {\n audio_base64: z.string().min(1).describe('Base64-encoded audio bytes.'),\n mime_type: z.string().optional().describe('Audio MIME type, e.g. audio/mpeg, audio/wav.'),\n filename: z.string().optional().describe('Original filename (helps format detection).'),\n model: z.string().optional().describe('STT model. Defaults to whisper-1.'),\n language: z.string().optional().describe('ISO language code, e.g. en.'),\n prompt: z.string().optional().describe('Optional prompt to guide transcription.'),\n response_format: z\n .enum(['json', 'text', 'srt', 'verbose_json', 'vtt'])\n .optional()\n .describe('Transcript format. verbose_json adds segments/words.'),\n temperature: z.number().min(0).max(1).optional(),\n provider: z.string().optional().describe('Override the STT provider.'),\n },\n annotations: WRITE_ANNOTATIONS,\n },\n async ({ audio_base64, mime_type, filename, model, language, prompt, response_format, temperature, provider }) => {\n const bytes = Buffer.from(audio_base64, 'base64');\n const form = new FormData();\n form.append('file', new Blob([bytes], { type: mime_type || 'application/octet-stream' }), filename || 'audio');\n if (model) form.append('model', model);\n if (language) form.append('language', language);\n if (prompt) form.append('prompt', prompt);\n if (response_format) form.append('response_format', response_format);\n if (temperature !== undefined) form.append('temperature', String(temperature));\n if (provider) form.append('provider', provider);\n return jsonResult(await client.postForm('/ai/audio/transcriptions', form));\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { jsonResult, READ_ONLY_ANNOTATIONS } from './shared.js';\n\n/**\n * Guidance (\"how_to_*\") tools for MANUAL-ONLY actions.\n *\n * These are security- or account-sensitive actions the MCP must NEVER perform\n * on the user's behalf — API keys, governance activation, billing, and access\n * changes. Instead each tool returns human steps + the exact dashboard URL so\n * the agent can tell the user to do it themselves. All read-only, always\n * available (no API key or capability flag required).\n */\n\nconst orgProjectShape = {\n org_slug: z.string().min(1).optional().describe('Your organization slug, to build an exact dashboard link.'),\n project_slug: z.string().min(1).optional().describe('Your project slug, to build an exact dashboard link.'),\n};\n\ntype SlugArgs = { org_slug?: string; project_slug?: string };\n\nfunction registerGuide(\n server: McpServer,\n name: string,\n title: string,\n description: string,\n buildPath: (args: SlugArgs) => string,\n steps: string[],\n baseUrl: string,\n): void {\n server.registerTool(\n name,\n {\n title,\n description,\n inputSchema: orgProjectShape,\n annotations: READ_ONLY_ANNOTATIONS,\n },\n async (args: SlugArgs) => {\n return jsonResult({\n manual_action: true,\n note: 'This action is intentionally not automated. Tell the user to complete it themselves in the Cencori dashboard.',\n steps,\n dashboard_url: `${baseUrl}${buildPath(args)}`,\n });\n },\n );\n}\n\nconst ORG = (s: SlugArgs) => s.org_slug ?? '<your-org>';\nconst PROJ = (s: SlugArgs) => s.project_slug ?? '<your-project>';\n\nexport function registerGuidanceTools(server: McpServer, baseUrl: string): void {\n // ── API keys ──────────────────────────────────────────────────────────\n registerGuide(\n server,\n 'how_to_create_api_key',\n 'How to create a Cencori API key',\n 'Steps for the USER to create a Cencori project API key. The MCP never creates keys.',\n (s) => `/${ORG(s)}/${PROJ(s)}/api-keys`,\n [\n 'Open the Cencori dashboard and select your organization, then your project.',\n 'Go to the project’s API Keys page.',\n 'Click “Create key”, name it, choose the environment, and copy the `csk_...` secret.',\n 'Store it server-side as CENCORI_API_KEY — it is shown only once.',\n ],\n baseUrl,\n );\n registerGuide(\n server,\n 'how_to_edit_api_key',\n 'How to edit a Cencori API key',\n 'Steps for the USER to rename or change scopes/limits on an API key. The MCP never edits keys.',\n (s) => `/${ORG(s)}/${PROJ(s)}/api-keys`,\n [\n 'Open the project’s API Keys page in the dashboard.',\n 'Find the key and open its actions menu.',\n 'Update its name, environment, or limits and save.',\n ],\n baseUrl,\n );\n registerGuide(\n server,\n 'how_to_revoke_api_key',\n 'How to revoke a Cencori API key',\n 'Steps for the USER to revoke/rotate an API key. The MCP never revokes keys.',\n (s) => `/${ORG(s)}/${PROJ(s)}/api-keys`,\n [\n 'Open the project’s API Keys page in the dashboard.',\n 'Find the key to revoke and choose “Revoke”. This immediately invalidates it.',\n 'If rotating, create a new key first and update CENCORI_API_KEY before revoking the old one.',\n ],\n baseUrl,\n );\n\n // ── Governance (human/checker steps) ──────────────────────────────────\n registerGuide(\n server,\n 'how_to_activate_policy',\n 'How to activate a governance policy',\n 'Steps for the USER to activate/retire a governance policy. Activation is a maker-checker human step — the MCP can draft a policy but never activates one.',\n (s) => `/${ORG(s)}/~/governance`,\n [\n 'Open the Governance page for your organization in the dashboard.',\n 'Find the draft (or pending-review) policy version.',\n 'Review it and, as an authorized checker, activate it. Exactly one version per policy can be active.',\n ],\n baseUrl,\n );\n registerGuide(\n server,\n 'how_to_respond_to_change_request',\n 'How to respond to a governance change request',\n 'Steps for the USER (as checker) to approve or reject a governance change request. The MCP never approves/rejects on the user’s behalf.',\n (s) => `/${ORG(s)}/~/governance`,\n [\n 'Open the Governance page and go to Change Requests.',\n 'Open the pending request and review the proposed change.',\n 'As an authorized checker, approve or reject it.',\n ],\n baseUrl,\n );\n\n // ── Billing ───────────────────────────────────────────────────────────\n registerGuide(\n server,\n 'how_to_change_plan',\n 'How to change your Cencori plan',\n 'Steps for the USER to change plan/tier. The MCP never changes plans or charges.',\n (s) => `/${ORG(s)}/~/billing`,\n [\n 'Open the Billing page for your organization in the dashboard.',\n 'Choose the plan you want and confirm the change.',\n ],\n baseUrl,\n );\n registerGuide(\n server,\n 'how_to_manage_billing',\n 'How to manage billing, payment methods, and credits',\n 'Steps for the USER to update payment methods or buy credits. The MCP never manages payment or credits.',\n (s) => `/${ORG(s)}/~/billing`,\n [\n 'Open the Billing page for your organization in the dashboard.',\n 'Update a payment method, or purchase credits, from the billing controls.',\n ],\n baseUrl,\n );\n\n // ── Access / members ──────────────────────────────────────────────────\n registerGuide(\n server,\n 'how_to_manage_members',\n 'How to manage members, roles, and SSO',\n 'Steps for the USER to invite/remove members, change roles, or configure SSO. The MCP never alters access.',\n (s) => `/${ORG(s)}/~/teams`,\n [\n 'Open the Teams page for your organization in the dashboard.',\n 'Invite or remove members, or change a member’s role.',\n 'Configure SSO from the organization settings if applicable.',\n ],\n baseUrl,\n );\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cencori/mcp",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "MCP server for Cencori — docs, gateway, memory, agents, sessions, governance, and multimodal inference for AI agents.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",