@ar-agents/mcp 0.1.1 → 0.2.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,56 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - MCP v0.2: ships `@ar-agents/banking` as a 5th tool registry.
8
+
9
+ The MCP server now exposes:
10
+
11
+ - `@ar-agents/identity` (validate_cuit, lookup_cuit_afip)
12
+ - `@ar-agents/identity-attest` (issue_attestation, verify_attestation)
13
+ - `@ar-agents/mercadopago` (41 MP API tools)
14
+ - `@ar-agents/whatsapp` (6 messaging tools)
15
+ - **NEW: `@ar-agents/banking` (validate_cbu, lookup_bank_by_code, list_banks, list_psps, lookup_credit_situation)**
16
+
17
+ Banking tools auto-wire to BCRA's public API via `BcraPublicApiAdapter`
18
+ (no auth required). To opt out, set `AR_AGENTS_BCRA_DISABLED=1` in env.
19
+ Tunables: `BCRA_TIMEOUT_MS` (default 30000), `BCRA_MAX_RETRIES` (default 1).
20
+
21
+ Server version bumped from 0.1.0 → 0.2.0 in the MCP handshake.
22
+
23
+ ## 0.1.3
24
+
25
+ ### Patch Changes
26
+
27
+ - Identity v0.5: production robustez parity with the rest of the toolkit.
28
+
29
+ **WSAA + WSCDC now share a hardened HTTP layer** (`fetchWithRetry`):
30
+
31
+ - Per-request timeouts via `AbortSignal` (default 30s, override with `requestTimeoutMs`).
32
+ - Exponential backoff on 5xx + transient network errors (default 1 retry, override with `maxRetries`).
33
+ - SOAP-aware: HTTP 500 with a real `<Fault>` body is treated as a parseable response (not retried).
34
+ - Optional `onCall` observability hook fires after every WSAA + WSCDC request — `{ label, durationMs, httpStatus, retried, success }` — drop-in for OpenTelemetry / Datadog / console.
35
+
36
+ **`WsaaWscdcAdapter` accepts the new options** (`requestTimeoutMs`, `maxRetries`, `onCall`) and forwards them to both the TA refresh path and the per-CUIT lookup path.
37
+
38
+ **`fetchWithRetry` is exported from `@ar-agents/identity/wsaa`** so multi-step flows (custom AFIP services, A4, A5, etc.) can reuse the same retry/timeout/observability stack.
39
+
40
+ No breaking changes — existing 0.4 setups keep working with the previous (no-retry, no-timeout) defaults until you opt in.
41
+
42
+ The MCP wrapper bumps to pull in the new identity major.
43
+
44
+ - Updated dependencies []:
45
+ - @ar-agents/identity@0.5.0
46
+
47
+ ## 0.1.2
48
+
49
+ ### Patch Changes
50
+
51
+ - Updated dependencies []:
52
+ - @ar-agents/mercadopago@0.4.0
53
+
3
54
  ## 0.1.1
4
55
 
5
56
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -4,6 +4,7 @@ var index_js = require('@modelcontextprotocol/sdk/server/index.js');
4
4
  var stdio_js = require('@modelcontextprotocol/sdk/server/stdio.js');
5
5
  var types_js = require('@modelcontextprotocol/sdk/types.js');
6
6
  var zod = require('zod');
7
+ var banking = require('@ar-agents/banking');
7
8
  var identity = require('@ar-agents/identity');
8
9
  var wsaa = require('@ar-agents/identity/wsaa');
9
10
  var identityAttest = require('@ar-agents/identity-attest');
@@ -65,6 +66,23 @@ function combineToolSets(toolSets) {
65
66
  }
66
67
  };
67
68
  }
69
+ function buildBankingTools() {
70
+ const bcra = buildBcraAdapter();
71
+ return banking.bankingTools(bcra ? { bcra } : {});
72
+ }
73
+ function buildBcraAdapter() {
74
+ if (process.env.AR_AGENTS_BCRA_DISABLED?.trim() === "1") return void 0;
75
+ const timeout = Number(process.env.BCRA_TIMEOUT_MS?.trim() ?? "30000");
76
+ const retries = Number(process.env.BCRA_MAX_RETRIES?.trim() ?? "1");
77
+ return new banking.BcraPublicApiAdapter({
78
+ requestTimeoutMs: Number.isFinite(timeout) ? timeout : 3e4,
79
+ maxRetries: Number.isFinite(retries) ? retries : 1
80
+ });
81
+ }
82
+ function describeBankingConfig() {
83
+ const bcraDisabled = process.env.AR_AGENTS_BCRA_DISABLED?.trim() === "1";
84
+ return bcraDisabled ? "validate_cbu, lookup_bank_by_code, list_banks, list_psps (BCRA disabled)" : "validate_cbu, lookup_bank_by_code, list_banks, list_psps, lookup_credit_situation (BCRA public API)";
85
+ }
68
86
  function buildIdentityTools() {
69
87
  const afip = buildAfipAdapter();
70
88
  return identity.identityTools(afip ? { afip } : {});
@@ -181,20 +199,22 @@ function describeMercadoPagoConfig() {
181
199
 
182
200
  // src/server.ts
183
201
  var SERVER_NAME = "ar-agents";
184
- var SERVER_VERSION = "0.1.0";
202
+ var SERVER_VERSION = "0.2.0";
185
203
  async function createServer() {
186
204
  const adapter = combineToolSets([
187
205
  buildIdentityTools(),
188
206
  buildMercadoPagoTools(),
189
207
  buildWhatsAppTools(),
190
- buildIdentityAttestTools()
208
+ buildIdentityAttestTools(),
209
+ buildBankingTools()
191
210
  ]);
192
211
  const summary = [
193
212
  `${SERVER_NAME}@${SERVER_VERSION} starting with ${adapter.tools.length} tools registered:`,
194
- ` identity \u2192 ${describeIdentityConfig()}`,
195
- ` mercadopago \u2192 ${describeMercadoPagoConfig()}`,
196
- ` whatsapp \u2192 ${describeWhatsAppConfig()}`,
197
- ` identity-attest \u2192 ${describeIdentityAttestConfig()}`
213
+ ` identity \u2192 ${describeIdentityConfig()}`,
214
+ ` mercadopago \u2192 ${describeMercadoPagoConfig()}`,
215
+ ` whatsapp \u2192 ${describeWhatsAppConfig()}`,
216
+ ` identity-attest \u2192 ${describeIdentityAttestConfig()}`,
217
+ ` banking \u2192 ${describeBankingConfig()}`
198
218
  ];
199
219
  const server = new index_js.Server(
200
220
  { name: SERVER_NAME, version: SERVER_VERSION },
@@ -229,12 +249,14 @@ async function startStdio() {
229
249
  }
230
250
 
231
251
  exports.adaptToolSetToMcp = adaptToolSetToMcp;
252
+ exports.buildBankingTools = buildBankingTools;
232
253
  exports.buildIdentityAttestTools = buildIdentityAttestTools;
233
254
  exports.buildIdentityTools = buildIdentityTools;
234
255
  exports.buildMercadoPagoTools = buildMercadoPagoTools;
235
256
  exports.buildWhatsAppTools = buildWhatsAppTools;
236
257
  exports.combineToolSets = combineToolSets;
237
258
  exports.createServer = createServer;
259
+ exports.describeBankingConfig = describeBankingConfig;
238
260
  exports.describeIdentityAttestConfig = describeIdentityAttestConfig;
239
261
  exports.describeIdentityConfig = describeIdentityConfig;
240
262
  exports.describeMercadoPagoConfig = describeMercadoPagoConfig;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapter.ts","../src/registries/identity.ts","../src/registries/whatsapp.ts","../src/registries/identity-attest.ts","../src/registries/mercadopago.ts","../src/server.ts"],"names":["z","identityTools","WsaaWscdcAfipPadronAdapter","whatsappTools","WhatsAppClient","WhatsAppOtpAdapter","EmailMagicLinkAdapter","AttestationClient","identityAttestTools","MercadoPagoClient","mercadoPagoTools","InMemoryStateAdapter","Server","ListToolsRequestSchema","CallToolRequestSchema","StdioServerTransport"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ToolSet } from \"ai\";\nimport { z } from \"zod\";\n\n/**\n * Convert a Vercel AI SDK ToolSet to MCP-compatible tool definitions.\n *\n * Vercel AI SDK's `tool()` shape:\n * { description, inputSchema: ZodSchema, execute: (args) => result }\n *\n * MCP's tool shape:\n * { name, description, inputSchema: JSONSchema }\n * + a separate handler that takes (name, args) and returns the result\n */\n\nexport interface McpTool {\n name: string;\n description: string;\n inputSchema: object; // JSON Schema\n}\n\nexport interface McpAdapter {\n /** All MCP tool definitions (for ListTools response). */\n tools: McpTool[];\n /** Handler for CallTool — looks up the original Vercel AI SDK tool and runs execute. */\n call: (name: string, args: unknown) => Promise<unknown>;\n}\n\n/**\n * Bridge a Vercel AI SDK ToolSet → MCP tools + dispatcher.\n *\n * Throws on unknown tool name or if execute is missing (safety: every Vercel\n * AI SDK tool ships with `execute` for server-side flows, which is what\n * MCP needs).\n */\nexport function adaptToolSetToMcp(toolSet: ToolSet): McpAdapter {\n const tools: McpTool[] = [];\n const lookup = new Map<string, (args: unknown) => Promise<unknown>>();\n\n for (const [name, tool] of Object.entries(toolSet)) {\n if (!tool || typeof tool !== \"object\") continue;\n const description =\n \"description\" in tool && typeof tool.description === \"string\" ? tool.description : \"\";\n const inputSchema =\n \"inputSchema\" in tool && tool.inputSchema\n ? (z.toJSONSchema(tool.inputSchema as z.ZodType) as object)\n : { type: \"object\", properties: {}, additionalProperties: false };\n\n tools.push({ name, description, inputSchema });\n\n const exec = \"execute\" in tool ? (tool.execute as (args: unknown) => Promise<unknown>) : null;\n if (!exec) {\n // Server-side execution required for MCP; skip tools without execute.\n continue;\n }\n lookup.set(name, exec);\n }\n\n return {\n tools,\n call: async (name, args) => {\n const fn = lookup.get(name);\n if (!fn) {\n throw new Error(`Tool \"${name}\" not found or has no execute fn (MCP requires server-side tools).`);\n }\n return fn(args);\n },\n };\n}\n\n/**\n * Combine multiple Vercel AI SDK ToolSets into a single McpAdapter. Tool\n * name collisions throw at adapter-build time.\n */\nexport function combineToolSets(toolSets: Array<ToolSet | null>): McpAdapter {\n const tools: McpTool[] = [];\n const lookup = new Map<string, (args: unknown) => Promise<unknown>>();\n const seen = new Set<string>();\n\n for (const ts of toolSets) {\n if (!ts) continue;\n const adapter = adaptToolSetToMcp(ts);\n for (const tool of adapter.tools) {\n if (seen.has(tool.name)) {\n throw new Error(\n `Tool name collision: \"${tool.name}\" appears in multiple registered tool sets. Rename one or skip a registry.`,\n );\n }\n seen.add(tool.name);\n tools.push(tool);\n // Bind this specific tool's call through the source adapter\n const sourceAdapter = adapter;\n const toolName = tool.name;\n lookup.set(toolName, (args: unknown) => sourceAdapter.call(toolName, args));\n }\n }\n\n return {\n tools,\n call: async (name, args) => {\n const fn = lookup.get(name);\n if (!fn) throw new Error(`Tool \"${name}\" not found in combined set.`);\n return fn(args);\n },\n };\n}\n","import { identityTools, type AfipPadronAdapter } from \"@ar-agents/identity\";\nimport { WsaaWscdcAfipPadronAdapter } from \"@ar-agents/identity/wsaa\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build the @ar-agents/identity tool set from environment variables.\n * Returns null when AFIP env vars are missing (the algorithm-only `validate_cuit`\n * is always available; lookup_cuit_afip falls back to UnconfiguredAfipPadronAdapter).\n */\nexport function buildIdentityTools(): ToolSet {\n const afip = buildAfipAdapter();\n return identityTools(afip ? { afip } : {}) as ToolSet;\n}\n\nfunction buildAfipAdapter(): AfipPadronAdapter | undefined {\n const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();\n if (!cuit) return undefined;\n const env = (process.env.AFIP_ENV?.trim() ?? \"prod\") as \"homo\" | \"prod\";\n const certPem = process.env.AFIP_CERT_PEM;\n const keyPem = process.env.AFIP_KEY_PEM;\n if (certPem && keyPem) {\n return new WsaaWscdcAfipPadronAdapter({ certPem, keyPem, cuitRepresentado: cuit, env });\n }\n const certPath = process.env.AFIP_CERT_PATH?.trim();\n const keyPath = process.env.AFIP_KEY_PATH?.trim();\n if (certPath && keyPath) {\n return new WsaaWscdcAfipPadronAdapter({ certPath, keyPath, cuitRepresentado: cuit, env });\n }\n return undefined;\n}\n\nexport function describeIdentityConfig(): string {\n const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();\n if (!cuit) return \"validate_cuit only (no AFIP cert configured)\";\n const certConfigured =\n !!process.env.AFIP_CERT_PEM || !!process.env.AFIP_CERT_PATH;\n return certConfigured\n ? `validate_cuit + lookup_cuit_afip (AFIP cert configured for CUIT ${cuit})`\n : `validate_cuit only (cert not configured)`;\n}\n","import { WhatsAppClient, whatsappTools } from \"@ar-agents/whatsapp\";\nimport type { ToolSet } from \"ai\";\n\nexport function buildWhatsAppTools(): ToolSet | null {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId) return null;\n return whatsappTools(new WhatsAppClient({ accessToken, phoneNumberId })) as ToolSet;\n}\n\nexport function describeWhatsAppConfig(): string {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId)\n return \"not configured (set WA_ACCESS_TOKEN + WA_PHONE_NUMBER_ID)\";\n return `phone_number_id=${phoneNumberId.slice(0, 6)}…`;\n}\n\n/** Returns the configured client, used by identity-attest's WhatsAppOtpAdapter. */\nexport function getWhatsAppClient(): WhatsAppClient | null {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId) return null;\n return new WhatsAppClient({ accessToken, phoneNumberId });\n}\n","import {\n AttestationClient,\n identityAttestTools,\n WhatsAppOtpAdapter,\n EmailMagicLinkAdapter,\n type EmailSender,\n} from \"@ar-agents/identity-attest\";\nimport type { ToolSet } from \"ai\";\nimport { getWhatsAppClient } from \"./whatsapp\";\n\n/**\n * Build @ar-agents/identity-attest tools if ATTEST_SIGNING_SECRET is set\n * and at least one adapter can be configured (WhatsApp client present\n * OR email sender configured via SMTP_URL / RESEND_API_KEY).\n */\nexport function buildIdentityAttestTools(): ToolSet | null {\n const signingSecret = process.env.ATTEST_SIGNING_SECRET?.trim();\n if (!signingSecret) return null;\n\n const adapters: Record<string, ConstructorParameters<typeof AttestationClient>[0][\"adapters\"][string]> = {};\n\n // WhatsApp OTP — requires WhatsApp client\n const wa = getWhatsAppClient();\n if (wa) {\n adapters[\"whatsapp_otp\"] = new WhatsAppOtpAdapter({\n whatsappClient: wa,\n businessName: process.env.BUSINESS_NAME?.trim() ?? \"this app\",\n });\n }\n\n // Email magic-link — requires Resend API key + callback URL\n const resendKey = process.env.RESEND_API_KEY?.trim();\n const callbackUrl = process.env.ATTEST_CALLBACK_URL?.trim();\n if (resendKey && callbackUrl) {\n const fromEmail = process.env.ATTEST_FROM_EMAIL?.trim() ?? \"noreply@example.com\";\n const sender: EmailSender = async ({ to, subject, html, text }) => {\n const res = await fetch(\"https://api.resend.com/emails\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${resendKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ from: fromEmail, to, subject, html, text }),\n });\n if (!res.ok) {\n throw new Error(`Resend send failed: ${res.status} ${await res.text()}`);\n }\n };\n adapters[\"email_magic_link\"] = new EmailMagicLinkAdapter({\n sender,\n callbackBaseUrl: callbackUrl,\n businessName: process.env.BUSINESS_NAME?.trim() ?? \"this app\",\n });\n }\n\n if (Object.keys(adapters).length === 0) return null;\n\n const client = new AttestationClient({ signingSecret, adapters });\n return identityAttestTools(client) as ToolSet;\n}\n\nexport function describeIdentityAttestConfig(): string {\n const signingSecret = process.env.ATTEST_SIGNING_SECRET?.trim();\n if (!signingSecret) return \"not configured (set ATTEST_SIGNING_SECRET)\";\n const adapters: string[] = [];\n if (getWhatsAppClient()) adapters.push(\"whatsapp_otp\");\n if (process.env.RESEND_API_KEY?.trim() && process.env.ATTEST_CALLBACK_URL?.trim())\n adapters.push(\"email_magic_link\");\n if (adapters.length === 0)\n return \"configured but no adapters (set WhatsApp creds and/or RESEND_API_KEY + ATTEST_CALLBACK_URL)\";\n return adapters.join(\", \");\n}\n","import {\n InMemoryStateAdapter,\n MercadoPagoClient,\n mercadoPagoTools,\n} from \"@ar-agents/mercadopago\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build @ar-agents/mercadopago tools if MP_ACCESS_TOKEN is set.\n * Returns null when not configured.\n */\nexport function buildMercadoPagoTools(): ToolSet | null {\n const accessToken = process.env.MP_ACCESS_TOKEN?.trim();\n if (!accessToken) return null;\n const client = new MercadoPagoClient({ accessToken });\n const backUrl = process.env.MP_BACK_URL?.trim() ?? \"https://example.com/done\";\n return mercadoPagoTools(client, {\n state: new InMemoryStateAdapter(),\n backUrl,\n }) as ToolSet;\n}\n\nexport function describeMercadoPagoConfig(): string {\n const token = process.env.MP_ACCESS_TOKEN?.trim();\n if (!token) return \"not configured (set MP_ACCESS_TOKEN)\";\n const isTest = token.startsWith(\"TEST-\");\n const backUrl = process.env.MP_BACK_URL?.trim();\n return `${isTest ? \"TEST\" : \"PROD\"} mode${backUrl ? ` · back_url=${backUrl}` : \" · using default back_url\"}`;\n}\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { combineToolSets } from \"./adapter\";\nimport { buildIdentityTools, describeIdentityConfig } from \"./registries/identity\";\nimport {\n buildIdentityAttestTools,\n describeIdentityAttestConfig,\n} from \"./registries/identity-attest\";\nimport {\n buildMercadoPagoTools,\n describeMercadoPagoConfig,\n} from \"./registries/mercadopago\";\nimport { buildWhatsAppTools, describeWhatsAppConfig } from \"./registries/whatsapp\";\n\nconst SERVER_NAME = \"ar-agents\";\nconst SERVER_VERSION = \"0.1.0\";\n\n/**\n * Build the @ar-agents/mcp server. Inspects environment variables to decide\n * which package's tools to register. Always registers @ar-agents/identity\n * (algorithm-only `validate_cuit` works without any env vars).\n */\nexport async function createServer(): Promise<{ server: Server; summary: string[] }> {\n const adapter = combineToolSets([\n buildIdentityTools(),\n buildMercadoPagoTools(),\n buildWhatsAppTools(),\n buildIdentityAttestTools(),\n ]);\n\n const summary = [\n `${SERVER_NAME}@${SERVER_VERSION} starting with ${adapter.tools.length} tools registered:`,\n ` identity → ${describeIdentityConfig()}`,\n ` mercadopago → ${describeMercadoPagoConfig()}`,\n ` whatsapp → ${describeWhatsAppConfig()}`,\n ` identity-attest → ${describeIdentityAttestConfig()}`,\n ];\n\n const server = new Server(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {} } },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: adapter.tools,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n try {\n const result = await adapter.call(name, args ?? {});\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: \"text\", text: `Error calling ${name}: ${msg}` }],\n isError: true,\n };\n }\n });\n\n return { server, summary };\n}\n\n/**\n * Start the MCP server over stdio. Called by the CLI binary.\n * Logs the registered-tools summary to stderr (stdout is reserved for MCP\n * protocol messages).\n */\nexport async function startStdio(): Promise<void> {\n const { server, summary } = await createServer();\n for (const line of summary) console.error(line);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"ar-agents MCP server connected via stdio\");\n}\n"]}
1
+ {"version":3,"sources":["../src/adapter.ts","../src/registries/banking.ts","../src/registries/identity.ts","../src/registries/whatsapp.ts","../src/registries/identity-attest.ts","../src/registries/mercadopago.ts","../src/server.ts"],"names":["z","bankingTools","BcraPublicApiAdapter","identityTools","WsaaWscdcAfipPadronAdapter","whatsappTools","WhatsAppClient","WhatsAppOtpAdapter","EmailMagicLinkAdapter","AttestationClient","identityAttestTools","MercadoPagoClient","mercadoPagoTools","InMemoryStateAdapter","Server","ListToolsRequestSchema","CallToolRequestSchema","StdioServerTransport"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ToolSet } from \"ai\";\nimport { z } from \"zod\";\n\n/**\n * Convert a Vercel AI SDK ToolSet to MCP-compatible tool definitions.\n *\n * Vercel AI SDK's `tool()` shape:\n * { description, inputSchema: ZodSchema, execute: (args) => result }\n *\n * MCP's tool shape:\n * { name, description, inputSchema: JSONSchema }\n * + a separate handler that takes (name, args) and returns the result\n */\n\nexport interface McpTool {\n name: string;\n description: string;\n inputSchema: object; // JSON Schema\n}\n\nexport interface McpAdapter {\n /** All MCP tool definitions (for ListTools response). */\n tools: McpTool[];\n /** Handler for CallTool — looks up the original Vercel AI SDK tool and runs execute. */\n call: (name: string, args: unknown) => Promise<unknown>;\n}\n\n/**\n * Bridge a Vercel AI SDK ToolSet → MCP tools + dispatcher.\n *\n * Throws on unknown tool name or if execute is missing (safety: every Vercel\n * AI SDK tool ships with `execute` for server-side flows, which is what\n * MCP needs).\n */\nexport function adaptToolSetToMcp(toolSet: ToolSet): McpAdapter {\n const tools: McpTool[] = [];\n const lookup = new Map<string, (args: unknown) => Promise<unknown>>();\n\n for (const [name, tool] of Object.entries(toolSet)) {\n if (!tool || typeof tool !== \"object\") continue;\n const description =\n \"description\" in tool && typeof tool.description === \"string\" ? tool.description : \"\";\n const inputSchema =\n \"inputSchema\" in tool && tool.inputSchema\n ? (z.toJSONSchema(tool.inputSchema as z.ZodType) as object)\n : { type: \"object\", properties: {}, additionalProperties: false };\n\n tools.push({ name, description, inputSchema });\n\n const exec = \"execute\" in tool ? (tool.execute as (args: unknown) => Promise<unknown>) : null;\n if (!exec) {\n // Server-side execution required for MCP; skip tools without execute.\n continue;\n }\n lookup.set(name, exec);\n }\n\n return {\n tools,\n call: async (name, args) => {\n const fn = lookup.get(name);\n if (!fn) {\n throw new Error(`Tool \"${name}\" not found or has no execute fn (MCP requires server-side tools).`);\n }\n return fn(args);\n },\n };\n}\n\n/**\n * Combine multiple Vercel AI SDK ToolSets into a single McpAdapter. Tool\n * name collisions throw at adapter-build time.\n */\nexport function combineToolSets(toolSets: Array<ToolSet | null>): McpAdapter {\n const tools: McpTool[] = [];\n const lookup = new Map<string, (args: unknown) => Promise<unknown>>();\n const seen = new Set<string>();\n\n for (const ts of toolSets) {\n if (!ts) continue;\n const adapter = adaptToolSetToMcp(ts);\n for (const tool of adapter.tools) {\n if (seen.has(tool.name)) {\n throw new Error(\n `Tool name collision: \"${tool.name}\" appears in multiple registered tool sets. Rename one or skip a registry.`,\n );\n }\n seen.add(tool.name);\n tools.push(tool);\n // Bind this specific tool's call through the source adapter\n const sourceAdapter = adapter;\n const toolName = tool.name;\n lookup.set(toolName, (args: unknown) => sourceAdapter.call(toolName, args));\n }\n }\n\n return {\n tools,\n call: async (name, args) => {\n const fn = lookup.get(name);\n if (!fn) throw new Error(`Tool \"${name}\" not found in combined set.`);\n return fn(args);\n },\n };\n}\n","import {\n bankingTools,\n BcraPublicApiAdapter,\n type BcraDeudaAdapter,\n} from \"@ar-agents/banking\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build the @ar-agents/banking tool set.\n *\n * Pure-algorithm tools (validate_cbu, lookup_bank_by_code, list_banks,\n * list_psps) are ALWAYS available — no env vars required.\n *\n * The BCRA Central de Deudores tool is wired to `BcraPublicApiAdapter`\n * by default (BCRA's public REST API needs no auth). To opt out, set\n * `AR_AGENTS_BCRA_DISABLED=1` in env — the tool then returns\n * `{ available: false, error: \"<setup instructions>\" }`.\n */\nexport function buildBankingTools(): ToolSet {\n const bcra = buildBcraAdapter();\n return bankingTools(bcra ? { bcra } : {}) as ToolSet;\n}\n\nfunction buildBcraAdapter(): BcraDeudaAdapter | undefined {\n if (process.env.AR_AGENTS_BCRA_DISABLED?.trim() === \"1\") return undefined;\n const timeout = Number(process.env.BCRA_TIMEOUT_MS?.trim() ?? \"30000\");\n const retries = Number(process.env.BCRA_MAX_RETRIES?.trim() ?? \"1\");\n return new BcraPublicApiAdapter({\n requestTimeoutMs: Number.isFinite(timeout) ? timeout : 30_000,\n maxRetries: Number.isFinite(retries) ? retries : 1,\n });\n}\n\nexport function describeBankingConfig(): string {\n const bcraDisabled = process.env.AR_AGENTS_BCRA_DISABLED?.trim() === \"1\";\n return bcraDisabled\n ? \"validate_cbu, lookup_bank_by_code, list_banks, list_psps (BCRA disabled)\"\n : \"validate_cbu, lookup_bank_by_code, list_banks, list_psps, lookup_credit_situation (BCRA public API)\";\n}\n","import { identityTools, type AfipPadronAdapter } from \"@ar-agents/identity\";\nimport { WsaaWscdcAfipPadronAdapter } from \"@ar-agents/identity/wsaa\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build the @ar-agents/identity tool set from environment variables.\n * Returns null when AFIP env vars are missing (the algorithm-only `validate_cuit`\n * is always available; lookup_cuit_afip falls back to UnconfiguredAfipPadronAdapter).\n */\nexport function buildIdentityTools(): ToolSet {\n const afip = buildAfipAdapter();\n return identityTools(afip ? { afip } : {}) as ToolSet;\n}\n\nfunction buildAfipAdapter(): AfipPadronAdapter | undefined {\n const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();\n if (!cuit) return undefined;\n const env = (process.env.AFIP_ENV?.trim() ?? \"prod\") as \"homo\" | \"prod\";\n const certPem = process.env.AFIP_CERT_PEM;\n const keyPem = process.env.AFIP_KEY_PEM;\n if (certPem && keyPem) {\n return new WsaaWscdcAfipPadronAdapter({ certPem, keyPem, cuitRepresentado: cuit, env });\n }\n const certPath = process.env.AFIP_CERT_PATH?.trim();\n const keyPath = process.env.AFIP_KEY_PATH?.trim();\n if (certPath && keyPath) {\n return new WsaaWscdcAfipPadronAdapter({ certPath, keyPath, cuitRepresentado: cuit, env });\n }\n return undefined;\n}\n\nexport function describeIdentityConfig(): string {\n const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();\n if (!cuit) return \"validate_cuit only (no AFIP cert configured)\";\n const certConfigured =\n !!process.env.AFIP_CERT_PEM || !!process.env.AFIP_CERT_PATH;\n return certConfigured\n ? `validate_cuit + lookup_cuit_afip (AFIP cert configured for CUIT ${cuit})`\n : `validate_cuit only (cert not configured)`;\n}\n","import { WhatsAppClient, whatsappTools } from \"@ar-agents/whatsapp\";\nimport type { ToolSet } from \"ai\";\n\nexport function buildWhatsAppTools(): ToolSet | null {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId) return null;\n return whatsappTools(new WhatsAppClient({ accessToken, phoneNumberId })) as ToolSet;\n}\n\nexport function describeWhatsAppConfig(): string {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId)\n return \"not configured (set WA_ACCESS_TOKEN + WA_PHONE_NUMBER_ID)\";\n return `phone_number_id=${phoneNumberId.slice(0, 6)}…`;\n}\n\n/** Returns the configured client, used by identity-attest's WhatsAppOtpAdapter. */\nexport function getWhatsAppClient(): WhatsAppClient | null {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId) return null;\n return new WhatsAppClient({ accessToken, phoneNumberId });\n}\n","import {\n AttestationClient,\n identityAttestTools,\n WhatsAppOtpAdapter,\n EmailMagicLinkAdapter,\n type EmailSender,\n} from \"@ar-agents/identity-attest\";\nimport type { ToolSet } from \"ai\";\nimport { getWhatsAppClient } from \"./whatsapp\";\n\n/**\n * Build @ar-agents/identity-attest tools if ATTEST_SIGNING_SECRET is set\n * and at least one adapter can be configured (WhatsApp client present\n * OR email sender configured via SMTP_URL / RESEND_API_KEY).\n */\nexport function buildIdentityAttestTools(): ToolSet | null {\n const signingSecret = process.env.ATTEST_SIGNING_SECRET?.trim();\n if (!signingSecret) return null;\n\n const adapters: Record<string, ConstructorParameters<typeof AttestationClient>[0][\"adapters\"][string]> = {};\n\n // WhatsApp OTP — requires WhatsApp client\n const wa = getWhatsAppClient();\n if (wa) {\n adapters[\"whatsapp_otp\"] = new WhatsAppOtpAdapter({\n whatsappClient: wa,\n businessName: process.env.BUSINESS_NAME?.trim() ?? \"this app\",\n });\n }\n\n // Email magic-link — requires Resend API key + callback URL\n const resendKey = process.env.RESEND_API_KEY?.trim();\n const callbackUrl = process.env.ATTEST_CALLBACK_URL?.trim();\n if (resendKey && callbackUrl) {\n const fromEmail = process.env.ATTEST_FROM_EMAIL?.trim() ?? \"noreply@example.com\";\n const sender: EmailSender = async ({ to, subject, html, text }) => {\n const res = await fetch(\"https://api.resend.com/emails\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${resendKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ from: fromEmail, to, subject, html, text }),\n });\n if (!res.ok) {\n throw new Error(`Resend send failed: ${res.status} ${await res.text()}`);\n }\n };\n adapters[\"email_magic_link\"] = new EmailMagicLinkAdapter({\n sender,\n callbackBaseUrl: callbackUrl,\n businessName: process.env.BUSINESS_NAME?.trim() ?? \"this app\",\n });\n }\n\n if (Object.keys(adapters).length === 0) return null;\n\n const client = new AttestationClient({ signingSecret, adapters });\n return identityAttestTools(client) as ToolSet;\n}\n\nexport function describeIdentityAttestConfig(): string {\n const signingSecret = process.env.ATTEST_SIGNING_SECRET?.trim();\n if (!signingSecret) return \"not configured (set ATTEST_SIGNING_SECRET)\";\n const adapters: string[] = [];\n if (getWhatsAppClient()) adapters.push(\"whatsapp_otp\");\n if (process.env.RESEND_API_KEY?.trim() && process.env.ATTEST_CALLBACK_URL?.trim())\n adapters.push(\"email_magic_link\");\n if (adapters.length === 0)\n return \"configured but no adapters (set WhatsApp creds and/or RESEND_API_KEY + ATTEST_CALLBACK_URL)\";\n return adapters.join(\", \");\n}\n","import {\n InMemoryStateAdapter,\n MercadoPagoClient,\n mercadoPagoTools,\n} from \"@ar-agents/mercadopago\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build @ar-agents/mercadopago tools if MP_ACCESS_TOKEN is set.\n * Returns null when not configured.\n */\nexport function buildMercadoPagoTools(): ToolSet | null {\n const accessToken = process.env.MP_ACCESS_TOKEN?.trim();\n if (!accessToken) return null;\n const client = new MercadoPagoClient({ accessToken });\n const backUrl = process.env.MP_BACK_URL?.trim() ?? \"https://example.com/done\";\n return mercadoPagoTools(client, {\n state: new InMemoryStateAdapter(),\n backUrl,\n }) as ToolSet;\n}\n\nexport function describeMercadoPagoConfig(): string {\n const token = process.env.MP_ACCESS_TOKEN?.trim();\n if (!token) return \"not configured (set MP_ACCESS_TOKEN)\";\n const isTest = token.startsWith(\"TEST-\");\n const backUrl = process.env.MP_BACK_URL?.trim();\n return `${isTest ? \"TEST\" : \"PROD\"} mode${backUrl ? ` · back_url=${backUrl}` : \" · using default back_url\"}`;\n}\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { combineToolSets } from \"./adapter\";\nimport { buildBankingTools, describeBankingConfig } from \"./registries/banking\";\nimport { buildIdentityTools, describeIdentityConfig } from \"./registries/identity\";\nimport {\n buildIdentityAttestTools,\n describeIdentityAttestConfig,\n} from \"./registries/identity-attest\";\nimport {\n buildMercadoPagoTools,\n describeMercadoPagoConfig,\n} from \"./registries/mercadopago\";\nimport { buildWhatsAppTools, describeWhatsAppConfig } from \"./registries/whatsapp\";\n\nconst SERVER_NAME = \"ar-agents\";\nconst SERVER_VERSION = \"0.2.0\";\n\n/**\n * Build the @ar-agents/mcp server. Inspects environment variables to decide\n * which package's tools to register. Always registers @ar-agents/identity\n * (algorithm-only `validate_cuit` works without any env vars).\n */\nexport async function createServer(): Promise<{ server: Server; summary: string[] }> {\n const adapter = combineToolSets([\n buildIdentityTools(),\n buildMercadoPagoTools(),\n buildWhatsAppTools(),\n buildIdentityAttestTools(),\n buildBankingTools(),\n ]);\n\n const summary = [\n `${SERVER_NAME}@${SERVER_VERSION} starting with ${adapter.tools.length} tools registered:`,\n ` identity → ${describeIdentityConfig()}`,\n ` mercadopago → ${describeMercadoPagoConfig()}`,\n ` whatsapp → ${describeWhatsAppConfig()}`,\n ` identity-attest → ${describeIdentityAttestConfig()}`,\n ` banking → ${describeBankingConfig()}`,\n ];\n\n const server = new Server(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {} } },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: adapter.tools,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n try {\n const result = await adapter.call(name, args ?? {});\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: \"text\", text: `Error calling ${name}: ${msg}` }],\n isError: true,\n };\n }\n });\n\n return { server, summary };\n}\n\n/**\n * Start the MCP server over stdio. Called by the CLI binary.\n * Logs the registered-tools summary to stderr (stdout is reserved for MCP\n * protocol messages).\n */\nexport async function startStdio(): Promise<void> {\n const { server, summary } = await createServer();\n for (const line of summary) console.error(line);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"ar-agents MCP server connected via stdio\");\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -81,4 +81,18 @@ declare function getWhatsAppClient(): WhatsAppClient | null;
81
81
  declare function buildIdentityAttestTools(): ToolSet | null;
82
82
  declare function describeIdentityAttestConfig(): string;
83
83
 
84
- export { type McpAdapter, type McpTool, adaptToolSetToMcp, buildIdentityAttestTools, buildIdentityTools, buildMercadoPagoTools, buildWhatsAppTools, combineToolSets, createServer, describeIdentityAttestConfig, describeIdentityConfig, describeMercadoPagoConfig, describeWhatsAppConfig, getWhatsAppClient, startStdio };
84
+ /**
85
+ * Build the @ar-agents/banking tool set.
86
+ *
87
+ * Pure-algorithm tools (validate_cbu, lookup_bank_by_code, list_banks,
88
+ * list_psps) are ALWAYS available — no env vars required.
89
+ *
90
+ * The BCRA Central de Deudores tool is wired to `BcraPublicApiAdapter`
91
+ * by default (BCRA's public REST API needs no auth). To opt out, set
92
+ * `AR_AGENTS_BCRA_DISABLED=1` in env — the tool then returns
93
+ * `{ available: false, error: "<setup instructions>" }`.
94
+ */
95
+ declare function buildBankingTools(): ToolSet;
96
+ declare function describeBankingConfig(): string;
97
+
98
+ export { type McpAdapter, type McpTool, adaptToolSetToMcp, buildBankingTools, buildIdentityAttestTools, buildIdentityTools, buildMercadoPagoTools, buildWhatsAppTools, combineToolSets, createServer, describeBankingConfig, describeIdentityAttestConfig, describeIdentityConfig, describeMercadoPagoConfig, describeWhatsAppConfig, getWhatsAppClient, startStdio };
package/dist/index.d.ts CHANGED
@@ -81,4 +81,18 @@ declare function getWhatsAppClient(): WhatsAppClient | null;
81
81
  declare function buildIdentityAttestTools(): ToolSet | null;
82
82
  declare function describeIdentityAttestConfig(): string;
83
83
 
84
- export { type McpAdapter, type McpTool, adaptToolSetToMcp, buildIdentityAttestTools, buildIdentityTools, buildMercadoPagoTools, buildWhatsAppTools, combineToolSets, createServer, describeIdentityAttestConfig, describeIdentityConfig, describeMercadoPagoConfig, describeWhatsAppConfig, getWhatsAppClient, startStdio };
84
+ /**
85
+ * Build the @ar-agents/banking tool set.
86
+ *
87
+ * Pure-algorithm tools (validate_cbu, lookup_bank_by_code, list_banks,
88
+ * list_psps) are ALWAYS available — no env vars required.
89
+ *
90
+ * The BCRA Central de Deudores tool is wired to `BcraPublicApiAdapter`
91
+ * by default (BCRA's public REST API needs no auth). To opt out, set
92
+ * `AR_AGENTS_BCRA_DISABLED=1` in env — the tool then returns
93
+ * `{ available: false, error: "<setup instructions>" }`.
94
+ */
95
+ declare function buildBankingTools(): ToolSet;
96
+ declare function describeBankingConfig(): string;
97
+
98
+ export { type McpAdapter, type McpTool, adaptToolSetToMcp, buildBankingTools, buildIdentityAttestTools, buildIdentityTools, buildMercadoPagoTools, buildWhatsAppTools, combineToolSets, createServer, describeBankingConfig, describeIdentityAttestConfig, describeIdentityConfig, describeMercadoPagoConfig, describeWhatsAppConfig, getWhatsAppClient, startStdio };
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
2
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
3
  import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
4
4
  import { z } from 'zod';
5
+ import { bankingTools, BcraPublicApiAdapter } from '@ar-agents/banking';
5
6
  import { identityTools } from '@ar-agents/identity';
6
7
  import { WsaaWscdcAfipPadronAdapter } from '@ar-agents/identity/wsaa';
7
8
  import { WhatsAppOtpAdapter, EmailMagicLinkAdapter, AttestationClient, identityAttestTools } from '@ar-agents/identity-attest';
@@ -63,6 +64,23 @@ function combineToolSets(toolSets) {
63
64
  }
64
65
  };
65
66
  }
67
+ function buildBankingTools() {
68
+ const bcra = buildBcraAdapter();
69
+ return bankingTools(bcra ? { bcra } : {});
70
+ }
71
+ function buildBcraAdapter() {
72
+ if (process.env.AR_AGENTS_BCRA_DISABLED?.trim() === "1") return void 0;
73
+ const timeout = Number(process.env.BCRA_TIMEOUT_MS?.trim() ?? "30000");
74
+ const retries = Number(process.env.BCRA_MAX_RETRIES?.trim() ?? "1");
75
+ return new BcraPublicApiAdapter({
76
+ requestTimeoutMs: Number.isFinite(timeout) ? timeout : 3e4,
77
+ maxRetries: Number.isFinite(retries) ? retries : 1
78
+ });
79
+ }
80
+ function describeBankingConfig() {
81
+ const bcraDisabled = process.env.AR_AGENTS_BCRA_DISABLED?.trim() === "1";
82
+ return bcraDisabled ? "validate_cbu, lookup_bank_by_code, list_banks, list_psps (BCRA disabled)" : "validate_cbu, lookup_bank_by_code, list_banks, list_psps, lookup_credit_situation (BCRA public API)";
83
+ }
66
84
  function buildIdentityTools() {
67
85
  const afip = buildAfipAdapter();
68
86
  return identityTools(afip ? { afip } : {});
@@ -179,20 +197,22 @@ function describeMercadoPagoConfig() {
179
197
 
180
198
  // src/server.ts
181
199
  var SERVER_NAME = "ar-agents";
182
- var SERVER_VERSION = "0.1.0";
200
+ var SERVER_VERSION = "0.2.0";
183
201
  async function createServer() {
184
202
  const adapter = combineToolSets([
185
203
  buildIdentityTools(),
186
204
  buildMercadoPagoTools(),
187
205
  buildWhatsAppTools(),
188
- buildIdentityAttestTools()
206
+ buildIdentityAttestTools(),
207
+ buildBankingTools()
189
208
  ]);
190
209
  const summary = [
191
210
  `${SERVER_NAME}@${SERVER_VERSION} starting with ${adapter.tools.length} tools registered:`,
192
- ` identity \u2192 ${describeIdentityConfig()}`,
193
- ` mercadopago \u2192 ${describeMercadoPagoConfig()}`,
194
- ` whatsapp \u2192 ${describeWhatsAppConfig()}`,
195
- ` identity-attest \u2192 ${describeIdentityAttestConfig()}`
211
+ ` identity \u2192 ${describeIdentityConfig()}`,
212
+ ` mercadopago \u2192 ${describeMercadoPagoConfig()}`,
213
+ ` whatsapp \u2192 ${describeWhatsAppConfig()}`,
214
+ ` identity-attest \u2192 ${describeIdentityAttestConfig()}`,
215
+ ` banking \u2192 ${describeBankingConfig()}`
196
216
  ];
197
217
  const server = new Server(
198
218
  { name: SERVER_NAME, version: SERVER_VERSION },
@@ -226,6 +246,6 @@ async function startStdio() {
226
246
  console.error("ar-agents MCP server connected via stdio");
227
247
  }
228
248
 
229
- export { adaptToolSetToMcp, buildIdentityAttestTools, buildIdentityTools, buildMercadoPagoTools, buildWhatsAppTools, combineToolSets, createServer, describeIdentityAttestConfig, describeIdentityConfig, describeMercadoPagoConfig, describeWhatsAppConfig, getWhatsAppClient, startStdio };
249
+ export { adaptToolSetToMcp, buildBankingTools, buildIdentityAttestTools, buildIdentityTools, buildMercadoPagoTools, buildWhatsAppTools, combineToolSets, createServer, describeBankingConfig, describeIdentityAttestConfig, describeIdentityConfig, describeMercadoPagoConfig, describeWhatsAppConfig, getWhatsAppClient, startStdio };
230
250
  //# sourceMappingURL=index.js.map
231
251
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapter.ts","../src/registries/identity.ts","../src/registries/whatsapp.ts","../src/registries/identity-attest.ts","../src/registries/mercadopago.ts","../src/server.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { ToolSet } from \"ai\";\nimport { z } from \"zod\";\n\n/**\n * Convert a Vercel AI SDK ToolSet to MCP-compatible tool definitions.\n *\n * Vercel AI SDK's `tool()` shape:\n * { description, inputSchema: ZodSchema, execute: (args) => result }\n *\n * MCP's tool shape:\n * { name, description, inputSchema: JSONSchema }\n * + a separate handler that takes (name, args) and returns the result\n */\n\nexport interface McpTool {\n name: string;\n description: string;\n inputSchema: object; // JSON Schema\n}\n\nexport interface McpAdapter {\n /** All MCP tool definitions (for ListTools response). */\n tools: McpTool[];\n /** Handler for CallTool — looks up the original Vercel AI SDK tool and runs execute. */\n call: (name: string, args: unknown) => Promise<unknown>;\n}\n\n/**\n * Bridge a Vercel AI SDK ToolSet → MCP tools + dispatcher.\n *\n * Throws on unknown tool name or if execute is missing (safety: every Vercel\n * AI SDK tool ships with `execute` for server-side flows, which is what\n * MCP needs).\n */\nexport function adaptToolSetToMcp(toolSet: ToolSet): McpAdapter {\n const tools: McpTool[] = [];\n const lookup = new Map<string, (args: unknown) => Promise<unknown>>();\n\n for (const [name, tool] of Object.entries(toolSet)) {\n if (!tool || typeof tool !== \"object\") continue;\n const description =\n \"description\" in tool && typeof tool.description === \"string\" ? tool.description : \"\";\n const inputSchema =\n \"inputSchema\" in tool && tool.inputSchema\n ? (z.toJSONSchema(tool.inputSchema as z.ZodType) as object)\n : { type: \"object\", properties: {}, additionalProperties: false };\n\n tools.push({ name, description, inputSchema });\n\n const exec = \"execute\" in tool ? (tool.execute as (args: unknown) => Promise<unknown>) : null;\n if (!exec) {\n // Server-side execution required for MCP; skip tools without execute.\n continue;\n }\n lookup.set(name, exec);\n }\n\n return {\n tools,\n call: async (name, args) => {\n const fn = lookup.get(name);\n if (!fn) {\n throw new Error(`Tool \"${name}\" not found or has no execute fn (MCP requires server-side tools).`);\n }\n return fn(args);\n },\n };\n}\n\n/**\n * Combine multiple Vercel AI SDK ToolSets into a single McpAdapter. Tool\n * name collisions throw at adapter-build time.\n */\nexport function combineToolSets(toolSets: Array<ToolSet | null>): McpAdapter {\n const tools: McpTool[] = [];\n const lookup = new Map<string, (args: unknown) => Promise<unknown>>();\n const seen = new Set<string>();\n\n for (const ts of toolSets) {\n if (!ts) continue;\n const adapter = adaptToolSetToMcp(ts);\n for (const tool of adapter.tools) {\n if (seen.has(tool.name)) {\n throw new Error(\n `Tool name collision: \"${tool.name}\" appears in multiple registered tool sets. Rename one or skip a registry.`,\n );\n }\n seen.add(tool.name);\n tools.push(tool);\n // Bind this specific tool's call through the source adapter\n const sourceAdapter = adapter;\n const toolName = tool.name;\n lookup.set(toolName, (args: unknown) => sourceAdapter.call(toolName, args));\n }\n }\n\n return {\n tools,\n call: async (name, args) => {\n const fn = lookup.get(name);\n if (!fn) throw new Error(`Tool \"${name}\" not found in combined set.`);\n return fn(args);\n },\n };\n}\n","import { identityTools, type AfipPadronAdapter } from \"@ar-agents/identity\";\nimport { WsaaWscdcAfipPadronAdapter } from \"@ar-agents/identity/wsaa\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build the @ar-agents/identity tool set from environment variables.\n * Returns null when AFIP env vars are missing (the algorithm-only `validate_cuit`\n * is always available; lookup_cuit_afip falls back to UnconfiguredAfipPadronAdapter).\n */\nexport function buildIdentityTools(): ToolSet {\n const afip = buildAfipAdapter();\n return identityTools(afip ? { afip } : {}) as ToolSet;\n}\n\nfunction buildAfipAdapter(): AfipPadronAdapter | undefined {\n const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();\n if (!cuit) return undefined;\n const env = (process.env.AFIP_ENV?.trim() ?? \"prod\") as \"homo\" | \"prod\";\n const certPem = process.env.AFIP_CERT_PEM;\n const keyPem = process.env.AFIP_KEY_PEM;\n if (certPem && keyPem) {\n return new WsaaWscdcAfipPadronAdapter({ certPem, keyPem, cuitRepresentado: cuit, env });\n }\n const certPath = process.env.AFIP_CERT_PATH?.trim();\n const keyPath = process.env.AFIP_KEY_PATH?.trim();\n if (certPath && keyPath) {\n return new WsaaWscdcAfipPadronAdapter({ certPath, keyPath, cuitRepresentado: cuit, env });\n }\n return undefined;\n}\n\nexport function describeIdentityConfig(): string {\n const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();\n if (!cuit) return \"validate_cuit only (no AFIP cert configured)\";\n const certConfigured =\n !!process.env.AFIP_CERT_PEM || !!process.env.AFIP_CERT_PATH;\n return certConfigured\n ? `validate_cuit + lookup_cuit_afip (AFIP cert configured for CUIT ${cuit})`\n : `validate_cuit only (cert not configured)`;\n}\n","import { WhatsAppClient, whatsappTools } from \"@ar-agents/whatsapp\";\nimport type { ToolSet } from \"ai\";\n\nexport function buildWhatsAppTools(): ToolSet | null {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId) return null;\n return whatsappTools(new WhatsAppClient({ accessToken, phoneNumberId })) as ToolSet;\n}\n\nexport function describeWhatsAppConfig(): string {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId)\n return \"not configured (set WA_ACCESS_TOKEN + WA_PHONE_NUMBER_ID)\";\n return `phone_number_id=${phoneNumberId.slice(0, 6)}…`;\n}\n\n/** Returns the configured client, used by identity-attest's WhatsAppOtpAdapter. */\nexport function getWhatsAppClient(): WhatsAppClient | null {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId) return null;\n return new WhatsAppClient({ accessToken, phoneNumberId });\n}\n","import {\n AttestationClient,\n identityAttestTools,\n WhatsAppOtpAdapter,\n EmailMagicLinkAdapter,\n type EmailSender,\n} from \"@ar-agents/identity-attest\";\nimport type { ToolSet } from \"ai\";\nimport { getWhatsAppClient } from \"./whatsapp\";\n\n/**\n * Build @ar-agents/identity-attest tools if ATTEST_SIGNING_SECRET is set\n * and at least one adapter can be configured (WhatsApp client present\n * OR email sender configured via SMTP_URL / RESEND_API_KEY).\n */\nexport function buildIdentityAttestTools(): ToolSet | null {\n const signingSecret = process.env.ATTEST_SIGNING_SECRET?.trim();\n if (!signingSecret) return null;\n\n const adapters: Record<string, ConstructorParameters<typeof AttestationClient>[0][\"adapters\"][string]> = {};\n\n // WhatsApp OTP — requires WhatsApp client\n const wa = getWhatsAppClient();\n if (wa) {\n adapters[\"whatsapp_otp\"] = new WhatsAppOtpAdapter({\n whatsappClient: wa,\n businessName: process.env.BUSINESS_NAME?.trim() ?? \"this app\",\n });\n }\n\n // Email magic-link — requires Resend API key + callback URL\n const resendKey = process.env.RESEND_API_KEY?.trim();\n const callbackUrl = process.env.ATTEST_CALLBACK_URL?.trim();\n if (resendKey && callbackUrl) {\n const fromEmail = process.env.ATTEST_FROM_EMAIL?.trim() ?? \"noreply@example.com\";\n const sender: EmailSender = async ({ to, subject, html, text }) => {\n const res = await fetch(\"https://api.resend.com/emails\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${resendKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ from: fromEmail, to, subject, html, text }),\n });\n if (!res.ok) {\n throw new Error(`Resend send failed: ${res.status} ${await res.text()}`);\n }\n };\n adapters[\"email_magic_link\"] = new EmailMagicLinkAdapter({\n sender,\n callbackBaseUrl: callbackUrl,\n businessName: process.env.BUSINESS_NAME?.trim() ?? \"this app\",\n });\n }\n\n if (Object.keys(adapters).length === 0) return null;\n\n const client = new AttestationClient({ signingSecret, adapters });\n return identityAttestTools(client) as ToolSet;\n}\n\nexport function describeIdentityAttestConfig(): string {\n const signingSecret = process.env.ATTEST_SIGNING_SECRET?.trim();\n if (!signingSecret) return \"not configured (set ATTEST_SIGNING_SECRET)\";\n const adapters: string[] = [];\n if (getWhatsAppClient()) adapters.push(\"whatsapp_otp\");\n if (process.env.RESEND_API_KEY?.trim() && process.env.ATTEST_CALLBACK_URL?.trim())\n adapters.push(\"email_magic_link\");\n if (adapters.length === 0)\n return \"configured but no adapters (set WhatsApp creds and/or RESEND_API_KEY + ATTEST_CALLBACK_URL)\";\n return adapters.join(\", \");\n}\n","import {\n InMemoryStateAdapter,\n MercadoPagoClient,\n mercadoPagoTools,\n} from \"@ar-agents/mercadopago\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build @ar-agents/mercadopago tools if MP_ACCESS_TOKEN is set.\n * Returns null when not configured.\n */\nexport function buildMercadoPagoTools(): ToolSet | null {\n const accessToken = process.env.MP_ACCESS_TOKEN?.trim();\n if (!accessToken) return null;\n const client = new MercadoPagoClient({ accessToken });\n const backUrl = process.env.MP_BACK_URL?.trim() ?? \"https://example.com/done\";\n return mercadoPagoTools(client, {\n state: new InMemoryStateAdapter(),\n backUrl,\n }) as ToolSet;\n}\n\nexport function describeMercadoPagoConfig(): string {\n const token = process.env.MP_ACCESS_TOKEN?.trim();\n if (!token) return \"not configured (set MP_ACCESS_TOKEN)\";\n const isTest = token.startsWith(\"TEST-\");\n const backUrl = process.env.MP_BACK_URL?.trim();\n return `${isTest ? \"TEST\" : \"PROD\"} mode${backUrl ? ` · back_url=${backUrl}` : \" · using default back_url\"}`;\n}\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { combineToolSets } from \"./adapter\";\nimport { buildIdentityTools, describeIdentityConfig } from \"./registries/identity\";\nimport {\n buildIdentityAttestTools,\n describeIdentityAttestConfig,\n} from \"./registries/identity-attest\";\nimport {\n buildMercadoPagoTools,\n describeMercadoPagoConfig,\n} from \"./registries/mercadopago\";\nimport { buildWhatsAppTools, describeWhatsAppConfig } from \"./registries/whatsapp\";\n\nconst SERVER_NAME = \"ar-agents\";\nconst SERVER_VERSION = \"0.1.0\";\n\n/**\n * Build the @ar-agents/mcp server. Inspects environment variables to decide\n * which package's tools to register. Always registers @ar-agents/identity\n * (algorithm-only `validate_cuit` works without any env vars).\n */\nexport async function createServer(): Promise<{ server: Server; summary: string[] }> {\n const adapter = combineToolSets([\n buildIdentityTools(),\n buildMercadoPagoTools(),\n buildWhatsAppTools(),\n buildIdentityAttestTools(),\n ]);\n\n const summary = [\n `${SERVER_NAME}@${SERVER_VERSION} starting with ${adapter.tools.length} tools registered:`,\n ` identity → ${describeIdentityConfig()}`,\n ` mercadopago → ${describeMercadoPagoConfig()}`,\n ` whatsapp → ${describeWhatsAppConfig()}`,\n ` identity-attest → ${describeIdentityAttestConfig()}`,\n ];\n\n const server = new Server(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {} } },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: adapter.tools,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n try {\n const result = await adapter.call(name, args ?? {});\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: \"text\", text: `Error calling ${name}: ${msg}` }],\n isError: true,\n };\n }\n });\n\n return { server, summary };\n}\n\n/**\n * Start the MCP server over stdio. Called by the CLI binary.\n * Logs the registered-tools summary to stderr (stdout is reserved for MCP\n * protocol messages).\n */\nexport async function startStdio(): Promise<void> {\n const { server, summary } = await createServer();\n for (const line of summary) console.error(line);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"ar-agents MCP server connected via stdio\");\n}\n"]}
1
+ {"version":3,"sources":["../src/adapter.ts","../src/registries/banking.ts","../src/registries/identity.ts","../src/registries/whatsapp.ts","../src/registries/identity-attest.ts","../src/registries/mercadopago.ts","../src/server.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { ToolSet } from \"ai\";\nimport { z } from \"zod\";\n\n/**\n * Convert a Vercel AI SDK ToolSet to MCP-compatible tool definitions.\n *\n * Vercel AI SDK's `tool()` shape:\n * { description, inputSchema: ZodSchema, execute: (args) => result }\n *\n * MCP's tool shape:\n * { name, description, inputSchema: JSONSchema }\n * + a separate handler that takes (name, args) and returns the result\n */\n\nexport interface McpTool {\n name: string;\n description: string;\n inputSchema: object; // JSON Schema\n}\n\nexport interface McpAdapter {\n /** All MCP tool definitions (for ListTools response). */\n tools: McpTool[];\n /** Handler for CallTool — looks up the original Vercel AI SDK tool and runs execute. */\n call: (name: string, args: unknown) => Promise<unknown>;\n}\n\n/**\n * Bridge a Vercel AI SDK ToolSet → MCP tools + dispatcher.\n *\n * Throws on unknown tool name or if execute is missing (safety: every Vercel\n * AI SDK tool ships with `execute` for server-side flows, which is what\n * MCP needs).\n */\nexport function adaptToolSetToMcp(toolSet: ToolSet): McpAdapter {\n const tools: McpTool[] = [];\n const lookup = new Map<string, (args: unknown) => Promise<unknown>>();\n\n for (const [name, tool] of Object.entries(toolSet)) {\n if (!tool || typeof tool !== \"object\") continue;\n const description =\n \"description\" in tool && typeof tool.description === \"string\" ? tool.description : \"\";\n const inputSchema =\n \"inputSchema\" in tool && tool.inputSchema\n ? (z.toJSONSchema(tool.inputSchema as z.ZodType) as object)\n : { type: \"object\", properties: {}, additionalProperties: false };\n\n tools.push({ name, description, inputSchema });\n\n const exec = \"execute\" in tool ? (tool.execute as (args: unknown) => Promise<unknown>) : null;\n if (!exec) {\n // Server-side execution required for MCP; skip tools without execute.\n continue;\n }\n lookup.set(name, exec);\n }\n\n return {\n tools,\n call: async (name, args) => {\n const fn = lookup.get(name);\n if (!fn) {\n throw new Error(`Tool \"${name}\" not found or has no execute fn (MCP requires server-side tools).`);\n }\n return fn(args);\n },\n };\n}\n\n/**\n * Combine multiple Vercel AI SDK ToolSets into a single McpAdapter. Tool\n * name collisions throw at adapter-build time.\n */\nexport function combineToolSets(toolSets: Array<ToolSet | null>): McpAdapter {\n const tools: McpTool[] = [];\n const lookup = new Map<string, (args: unknown) => Promise<unknown>>();\n const seen = new Set<string>();\n\n for (const ts of toolSets) {\n if (!ts) continue;\n const adapter = adaptToolSetToMcp(ts);\n for (const tool of adapter.tools) {\n if (seen.has(tool.name)) {\n throw new Error(\n `Tool name collision: \"${tool.name}\" appears in multiple registered tool sets. Rename one or skip a registry.`,\n );\n }\n seen.add(tool.name);\n tools.push(tool);\n // Bind this specific tool's call through the source adapter\n const sourceAdapter = adapter;\n const toolName = tool.name;\n lookup.set(toolName, (args: unknown) => sourceAdapter.call(toolName, args));\n }\n }\n\n return {\n tools,\n call: async (name, args) => {\n const fn = lookup.get(name);\n if (!fn) throw new Error(`Tool \"${name}\" not found in combined set.`);\n return fn(args);\n },\n };\n}\n","import {\n bankingTools,\n BcraPublicApiAdapter,\n type BcraDeudaAdapter,\n} from \"@ar-agents/banking\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build the @ar-agents/banking tool set.\n *\n * Pure-algorithm tools (validate_cbu, lookup_bank_by_code, list_banks,\n * list_psps) are ALWAYS available — no env vars required.\n *\n * The BCRA Central de Deudores tool is wired to `BcraPublicApiAdapter`\n * by default (BCRA's public REST API needs no auth). To opt out, set\n * `AR_AGENTS_BCRA_DISABLED=1` in env — the tool then returns\n * `{ available: false, error: \"<setup instructions>\" }`.\n */\nexport function buildBankingTools(): ToolSet {\n const bcra = buildBcraAdapter();\n return bankingTools(bcra ? { bcra } : {}) as ToolSet;\n}\n\nfunction buildBcraAdapter(): BcraDeudaAdapter | undefined {\n if (process.env.AR_AGENTS_BCRA_DISABLED?.trim() === \"1\") return undefined;\n const timeout = Number(process.env.BCRA_TIMEOUT_MS?.trim() ?? \"30000\");\n const retries = Number(process.env.BCRA_MAX_RETRIES?.trim() ?? \"1\");\n return new BcraPublicApiAdapter({\n requestTimeoutMs: Number.isFinite(timeout) ? timeout : 30_000,\n maxRetries: Number.isFinite(retries) ? retries : 1,\n });\n}\n\nexport function describeBankingConfig(): string {\n const bcraDisabled = process.env.AR_AGENTS_BCRA_DISABLED?.trim() === \"1\";\n return bcraDisabled\n ? \"validate_cbu, lookup_bank_by_code, list_banks, list_psps (BCRA disabled)\"\n : \"validate_cbu, lookup_bank_by_code, list_banks, list_psps, lookup_credit_situation (BCRA public API)\";\n}\n","import { identityTools, type AfipPadronAdapter } from \"@ar-agents/identity\";\nimport { WsaaWscdcAfipPadronAdapter } from \"@ar-agents/identity/wsaa\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build the @ar-agents/identity tool set from environment variables.\n * Returns null when AFIP env vars are missing (the algorithm-only `validate_cuit`\n * is always available; lookup_cuit_afip falls back to UnconfiguredAfipPadronAdapter).\n */\nexport function buildIdentityTools(): ToolSet {\n const afip = buildAfipAdapter();\n return identityTools(afip ? { afip } : {}) as ToolSet;\n}\n\nfunction buildAfipAdapter(): AfipPadronAdapter | undefined {\n const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();\n if (!cuit) return undefined;\n const env = (process.env.AFIP_ENV?.trim() ?? \"prod\") as \"homo\" | \"prod\";\n const certPem = process.env.AFIP_CERT_PEM;\n const keyPem = process.env.AFIP_KEY_PEM;\n if (certPem && keyPem) {\n return new WsaaWscdcAfipPadronAdapter({ certPem, keyPem, cuitRepresentado: cuit, env });\n }\n const certPath = process.env.AFIP_CERT_PATH?.trim();\n const keyPath = process.env.AFIP_KEY_PATH?.trim();\n if (certPath && keyPath) {\n return new WsaaWscdcAfipPadronAdapter({ certPath, keyPath, cuitRepresentado: cuit, env });\n }\n return undefined;\n}\n\nexport function describeIdentityConfig(): string {\n const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();\n if (!cuit) return \"validate_cuit only (no AFIP cert configured)\";\n const certConfigured =\n !!process.env.AFIP_CERT_PEM || !!process.env.AFIP_CERT_PATH;\n return certConfigured\n ? `validate_cuit + lookup_cuit_afip (AFIP cert configured for CUIT ${cuit})`\n : `validate_cuit only (cert not configured)`;\n}\n","import { WhatsAppClient, whatsappTools } from \"@ar-agents/whatsapp\";\nimport type { ToolSet } from \"ai\";\n\nexport function buildWhatsAppTools(): ToolSet | null {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId) return null;\n return whatsappTools(new WhatsAppClient({ accessToken, phoneNumberId })) as ToolSet;\n}\n\nexport function describeWhatsAppConfig(): string {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId)\n return \"not configured (set WA_ACCESS_TOKEN + WA_PHONE_NUMBER_ID)\";\n return `phone_number_id=${phoneNumberId.slice(0, 6)}…`;\n}\n\n/** Returns the configured client, used by identity-attest's WhatsAppOtpAdapter. */\nexport function getWhatsAppClient(): WhatsAppClient | null {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId) return null;\n return new WhatsAppClient({ accessToken, phoneNumberId });\n}\n","import {\n AttestationClient,\n identityAttestTools,\n WhatsAppOtpAdapter,\n EmailMagicLinkAdapter,\n type EmailSender,\n} from \"@ar-agents/identity-attest\";\nimport type { ToolSet } from \"ai\";\nimport { getWhatsAppClient } from \"./whatsapp\";\n\n/**\n * Build @ar-agents/identity-attest tools if ATTEST_SIGNING_SECRET is set\n * and at least one adapter can be configured (WhatsApp client present\n * OR email sender configured via SMTP_URL / RESEND_API_KEY).\n */\nexport function buildIdentityAttestTools(): ToolSet | null {\n const signingSecret = process.env.ATTEST_SIGNING_SECRET?.trim();\n if (!signingSecret) return null;\n\n const adapters: Record<string, ConstructorParameters<typeof AttestationClient>[0][\"adapters\"][string]> = {};\n\n // WhatsApp OTP — requires WhatsApp client\n const wa = getWhatsAppClient();\n if (wa) {\n adapters[\"whatsapp_otp\"] = new WhatsAppOtpAdapter({\n whatsappClient: wa,\n businessName: process.env.BUSINESS_NAME?.trim() ?? \"this app\",\n });\n }\n\n // Email magic-link — requires Resend API key + callback URL\n const resendKey = process.env.RESEND_API_KEY?.trim();\n const callbackUrl = process.env.ATTEST_CALLBACK_URL?.trim();\n if (resendKey && callbackUrl) {\n const fromEmail = process.env.ATTEST_FROM_EMAIL?.trim() ?? \"noreply@example.com\";\n const sender: EmailSender = async ({ to, subject, html, text }) => {\n const res = await fetch(\"https://api.resend.com/emails\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${resendKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ from: fromEmail, to, subject, html, text }),\n });\n if (!res.ok) {\n throw new Error(`Resend send failed: ${res.status} ${await res.text()}`);\n }\n };\n adapters[\"email_magic_link\"] = new EmailMagicLinkAdapter({\n sender,\n callbackBaseUrl: callbackUrl,\n businessName: process.env.BUSINESS_NAME?.trim() ?? \"this app\",\n });\n }\n\n if (Object.keys(adapters).length === 0) return null;\n\n const client = new AttestationClient({ signingSecret, adapters });\n return identityAttestTools(client) as ToolSet;\n}\n\nexport function describeIdentityAttestConfig(): string {\n const signingSecret = process.env.ATTEST_SIGNING_SECRET?.trim();\n if (!signingSecret) return \"not configured (set ATTEST_SIGNING_SECRET)\";\n const adapters: string[] = [];\n if (getWhatsAppClient()) adapters.push(\"whatsapp_otp\");\n if (process.env.RESEND_API_KEY?.trim() && process.env.ATTEST_CALLBACK_URL?.trim())\n adapters.push(\"email_magic_link\");\n if (adapters.length === 0)\n return \"configured but no adapters (set WhatsApp creds and/or RESEND_API_KEY + ATTEST_CALLBACK_URL)\";\n return adapters.join(\", \");\n}\n","import {\n InMemoryStateAdapter,\n MercadoPagoClient,\n mercadoPagoTools,\n} from \"@ar-agents/mercadopago\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build @ar-agents/mercadopago tools if MP_ACCESS_TOKEN is set.\n * Returns null when not configured.\n */\nexport function buildMercadoPagoTools(): ToolSet | null {\n const accessToken = process.env.MP_ACCESS_TOKEN?.trim();\n if (!accessToken) return null;\n const client = new MercadoPagoClient({ accessToken });\n const backUrl = process.env.MP_BACK_URL?.trim() ?? \"https://example.com/done\";\n return mercadoPagoTools(client, {\n state: new InMemoryStateAdapter(),\n backUrl,\n }) as ToolSet;\n}\n\nexport function describeMercadoPagoConfig(): string {\n const token = process.env.MP_ACCESS_TOKEN?.trim();\n if (!token) return \"not configured (set MP_ACCESS_TOKEN)\";\n const isTest = token.startsWith(\"TEST-\");\n const backUrl = process.env.MP_BACK_URL?.trim();\n return `${isTest ? \"TEST\" : \"PROD\"} mode${backUrl ? ` · back_url=${backUrl}` : \" · using default back_url\"}`;\n}\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { combineToolSets } from \"./adapter\";\nimport { buildBankingTools, describeBankingConfig } from \"./registries/banking\";\nimport { buildIdentityTools, describeIdentityConfig } from \"./registries/identity\";\nimport {\n buildIdentityAttestTools,\n describeIdentityAttestConfig,\n} from \"./registries/identity-attest\";\nimport {\n buildMercadoPagoTools,\n describeMercadoPagoConfig,\n} from \"./registries/mercadopago\";\nimport { buildWhatsAppTools, describeWhatsAppConfig } from \"./registries/whatsapp\";\n\nconst SERVER_NAME = \"ar-agents\";\nconst SERVER_VERSION = \"0.2.0\";\n\n/**\n * Build the @ar-agents/mcp server. Inspects environment variables to decide\n * which package's tools to register. Always registers @ar-agents/identity\n * (algorithm-only `validate_cuit` works without any env vars).\n */\nexport async function createServer(): Promise<{ server: Server; summary: string[] }> {\n const adapter = combineToolSets([\n buildIdentityTools(),\n buildMercadoPagoTools(),\n buildWhatsAppTools(),\n buildIdentityAttestTools(),\n buildBankingTools(),\n ]);\n\n const summary = [\n `${SERVER_NAME}@${SERVER_VERSION} starting with ${adapter.tools.length} tools registered:`,\n ` identity → ${describeIdentityConfig()}`,\n ` mercadopago → ${describeMercadoPagoConfig()}`,\n ` whatsapp → ${describeWhatsAppConfig()}`,\n ` identity-attest → ${describeIdentityAttestConfig()}`,\n ` banking → ${describeBankingConfig()}`,\n ];\n\n const server = new Server(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {} } },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: adapter.tools,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n try {\n const result = await adapter.call(name, args ?? {});\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: \"text\", text: `Error calling ${name}: ${msg}` }],\n isError: true,\n };\n }\n });\n\n return { server, summary };\n}\n\n/**\n * Start the MCP server over stdio. Called by the CLI binary.\n * Logs the registered-tools summary to stderr (stdout is reserved for MCP\n * protocol messages).\n */\nexport async function startStdio(): Promise<void> {\n const { server, summary } = await createServer();\n for (const line of summary) console.error(line);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"ar-agents MCP server connected via stdio\");\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ar-agents/mcp",
3
- "version": "0.1.1",
4
- "description": "MCP (Model Context Protocol) server that exposes the entire @ar-agents/* toolkit (identity, identity-attest, mercadopago, whatsapp) to any MCP host (Claude Desktop, Cursor, Codeium, etc.). One install, one config, all AR integrations.",
3
+ "version": "0.2.0",
4
+ "description": "MCP (Model Context Protocol) server that exposes the entire @ar-agents/* toolkit (identity, identity-attest, mercadopago, whatsapp, banking) to any MCP host (Claude Desktop, Cursor, Codeium, etc.). One install, one config, all AR integrations.",
5
5
  "keywords": [
6
6
  "mcp",
7
7
  "model-context-protocol",
@@ -11,7 +11,10 @@
11
11
  "argentina",
12
12
  "afip",
13
13
  "mercadopago",
14
- "whatsapp"
14
+ "whatsapp",
15
+ "banking",
16
+ "cbu",
17
+ "bcra"
15
18
  ],
16
19
  "license": "MIT",
17
20
  "author": "Nazareno Clemente <naza@helloastro.co>",
@@ -85,6 +88,7 @@
85
88
  }
86
89
  ],
87
90
  "dependencies": {
91
+ "@ar-agents/banking": "workspace:*",
88
92
  "@ar-agents/identity": "workspace:*",
89
93
  "@ar-agents/identity-attest": "workspace:*",
90
94
  "@ar-agents/mercadopago": "workspace:*",