auxiliar-mcp 0.18.0 → 0.22.1

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.
Files changed (48) hide show
  1. package/README.md +8 -118
  2. package/dist/about.d.ts +10 -0
  3. package/dist/about.js +16 -0
  4. package/dist/server.js +11 -169
  5. package/package.json +14 -34
  6. package/dist/data/capabilities.d.ts +0 -34
  7. package/dist/data/capabilities.generated.json +0 -33171
  8. package/dist/data/capabilities.js +0 -62
  9. package/dist/data/event-sources.d.ts +0 -47
  10. package/dist/data/event-sources.js +0 -125
  11. package/dist/data/pricing.d.ts +0 -1
  12. package/dist/data/pricing.js +0 -582
  13. package/dist/data/recommendations.d.ts +0 -1
  14. package/dist/data/recommendations.js +0 -2350
  15. package/dist/data/risks.d.ts +0 -1
  16. package/dist/data/risks.js +0 -366
  17. package/dist/data/solve.d.ts +0 -43
  18. package/dist/data/solve.js +0 -376
  19. package/dist/telemetry.d.ts +0 -48
  20. package/dist/telemetry.js +0 -72
  21. package/dist/tools/analytics.d.ts +0 -8
  22. package/dist/tools/analytics.js +0 -54
  23. package/dist/tools/compare-capabilities.d.ts +0 -35
  24. package/dist/tools/compare-capabilities.js +0 -101
  25. package/dist/tools/compatibility.d.ts +0 -16
  26. package/dist/tools/compatibility.js +0 -245
  27. package/dist/tools/find-capability.d.ts +0 -58
  28. package/dist/tools/find-capability.js +0 -161
  29. package/dist/tools/get-capability.d.ts +0 -21
  30. package/dist/tools/get-capability.js +0 -22
  31. package/dist/tools/invoke-capability.d.ts +0 -45
  32. package/dist/tools/invoke-capability.js +0 -109
  33. package/dist/tools/list-capabilities.d.ts +0 -39
  34. package/dist/tools/list-capabilities.js +0 -50
  35. package/dist/tools/list.d.ts +0 -23
  36. package/dist/tools/list.js +0 -106
  37. package/dist/tools/pricing.d.ts +0 -5
  38. package/dist/tools/pricing.js +0 -29
  39. package/dist/tools/recommend.d.ts +0 -42
  40. package/dist/tools/recommend.js +0 -331
  41. package/dist/tools/risks.d.ts +0 -5
  42. package/dist/tools/risks.js +0 -14
  43. package/dist/tools/setup.d.ts +0 -30
  44. package/dist/tools/setup.js +0 -316
  45. package/dist/tools/solve.d.ts +0 -31
  46. package/dist/tools/solve.js +0 -126
  47. package/dist/types/capability.d.ts +0 -276
  48. package/dist/types/capability.js +0 -191
package/README.md CHANGED
@@ -1,13 +1,14 @@
1
1
  # auxiliar-mcp
2
2
 
3
- The MCP server that tells your agent **which tool to install** for a task, and **which cloud service to pick** for a stack.
3
+ **Web access for AI agents** — search, scrape, extract, and crawl the live web across many providers through one billed API, so your agent fetches more reliably than its host's built-in tools and you never handle upstream API keys.
4
4
 
5
- Your agent is intelligent but stuck. It doesn't know Surya beats Tesseract by 1.5pp on word accuracy for Brazilian NFS-e invoices. It doesn't know SendGrid killed its free tier. It guesses, installs the wrong thing, and you burn 30 minutes.
5
+ `auxiliar-mcp` is the in-loop MCP client for the [auxiliar.ai](https://auxiliar.ai) gateway.
6
6
 
7
- **auxiliar-mcp** gives your agent reproducible eval-backed answers for the two questions it hits most:
7
+ ## Status: client in active development
8
8
 
9
- 1. **"What installable tool should I use for task X?"** skills, MCPs, vendor APIs, local binaries ranked on real-world corpora, via `solve_task`.
10
- 2. **"What cloud service should I pick for Y?"** — Chrome-verified pricing, risks, compatibility, setup commands for 77 services across 16 categories, via `recommend_service`.
9
+ The gateway is live; the **MCP client surface is being rebuilt** to wrap it (v1.0). During this transition the package ships a single informational tool, `about_auxiliar`, that points your agent at the gateway.
10
+
11
+ To use auxiliar today, get an API key at **[auxiliar.ai](https://auxiliar.ai)** and call the gateway directly over HTTP — one bearer token, one endpoint per capability, credit-metered, with upstream keys injected server-side.
11
12
 
12
13
  ## Install
13
14
 
@@ -19,121 +20,10 @@ claude mcp add auxiliar -- npx auxiliar-mcp
19
20
  npx auxiliar-mcp
20
21
  ```
21
22
 
22
- ## Tools (8)
23
-
24
- | Tool | What it does |
25
- |------|-------------|
26
- | `solve_task` | Get the ranked list of installable tools for a job-to-be-done (e.g., `pdf-text-extraction-mcp`, `nfs-e`, `boleto`, `receipt-parsing`, `bookkeeping-ocr`) with scorecards, install commands, FAQ, alternatives considered, and methodological caveats. |
27
- | `list_solve_tasks` | Discover every `/solve/` task ranking available — slugs, top picks, categories, agent compatibility. |
28
- | `recommend_service` | Picks the best cloud service for your constraints (framework, budget, region, GDPR, edge, lock-in). |
29
- | `get_pricing` | Chrome-verified pricing — including JS-rendered pages agents can't read via WebFetch. |
30
- | `get_risks` | Risk flags, gotchas, recent breaking changes. |
31
- | `check_compatibility` | Warns about known conflicts between services (e.g., Turso + Prisma needs adapter). |
32
- | `setup_service` | CLI commands, signup URLs, env vars, estimated setup time. |
33
- | `list_services` | Browse the full 77-service catalog, filtered by category. |
34
-
35
- ## When to use `solve_task`
36
-
37
- Your agent needs an **installable tool** (skill, MCP, vendor API, or local binary) and you want a reproducible evaluation, not vibes.
38
-
39
- ```
40
- Agent: "I need to extract text from Brazilian NFS-e invoices, boletos, and phone-photo receipts. What should I install?"
41
-
42
- → solve_task(task_slug="pdf-text-extraction-mcp")
43
- # aliases work too: "pdf", "ocr", "nfs-e", "boleto", "receipt-parsing", "bookkeeping-ocr", "invoice-extraction"
44
-
45
- Returns (truncated):
46
- {
47
- "answer": "Install Surya (pip install surya-ocr + pin transformers<5.0.0). It led our 10-document real-world corpus on word accuracy (76.9%) and layout preservation (7.0/10), free, local. Tesseract 5 runs 14× faster for throughput-critical workflows. Google Document AI wins on phone-photo receipts specifically...",
48
- "candidates": [
49
- { "slug": "surya", "rank": 1, "scorecard": {"word_accuracy": 0.769, "layout": 7, "p50_latency_sec": 22.1, "install_friction": 7, "cost_per_10_docs_usd": 0} },
50
- { "slug": "tesseract", "rank": 2, "scorecard": {"word_accuracy": 0.754, "layout": 5, "p50_latency_sec": 1.6, "install_friction": 3, "cost_per_10_docs_usd": 0} },
51
- { "slug": "google-document-ai", "rank": 3, "scorecard": {"word_accuracy": 0.697, "layout": 5.7, "p50_latency_sec": 3.8, "install_friction": 7, "cost_per_10_docs_usd": 0.069} }
52
- ],
53
- "corpus_summary": "10 real-world documents: native-text PDFs, legal docs, Brazilian corporate-registry scans, NFS-e invoices, boletos, phone-photo receipts.",
54
- "alternatives_considered": [ /* yescan, Mistral OCR, pdf-reader-mcp — dropped with reasons */ ],
55
- "faq": [ /* e.g., "Why does all score 0 on the boleto?" */ ]
56
- }
57
- ```
58
-
59
- Full page with reproducible commands: https://auxiliar.ai/solve/pdf-text-extraction-mcp/
60
-
61
- ## When to use `recommend_service`
62
-
63
- Your agent needs a **cloud service** (database, email provider, auth, payments, etc.).
64
-
65
- ```
66
- Agent: "I need a database for my Next.js app. Budget is free, deployed to Cloudflare Workers."
67
-
68
- → recommend_service(need="database", framework="nextjs", budget="free", constraints="edge, zero cold starts")
69
-
70
- Returns:
71
- {
72
- "provider": "turso",
73
- "reason": "Edge-native SQLite with zero cold starts and embedded replicas",
74
- "pricing": { "free_tier": "5 GB storage, 100 databases" },
75
- "risks": ["Not PostgreSQL — limited ORM support"],
76
- "migration_difficulty": "high",
77
- "cli_install": "brew install tursodatabase/tap/turso",
78
- "alternatives": [{"provider": "neon", "trade_off": "Has cold starts on free tier"}]
79
- }
80
- ```
81
-
82
- ## Services Covered (77)
83
-
84
- **Database:** Neon, Supabase, Turso, PlanetScale, Render Postgres, AWS RDS, Railway Postgres, Cloudflare D1
85
- **Email:** Resend, Postmark, SendGrid, AWS SES, Mailgun, Listmonk
86
- **Auth:** Better Auth, Clerk, Auth0, Firebase Auth, Supabase Auth, Auth.js
87
- **Payments:** Stripe, Lemon Squeezy, Paddle, RevenueCat
88
- **Deploy:** Vercel, Railway, Render, Fly.io
89
- **Search:** Algolia, Typesense, Meilisearch, PostgreSQL FTS
90
- **CMS:** Sanity, Contentful, Strapi, Payload, Keystatic, Directus, Ghost
91
- **Monitoring:** Sentry, Datadog, PostHog, Grafana Cloud, BetterStack, Highlight.io
92
- **Storage:** Cloudflare R2, AWS S3, Uploadthing, MinIO
93
- **Cache:** Upstash Redis, Momento, Dragonfly
94
- **Queues:** BullMQ, Inngest, Trigger.dev, AWS SQS, CloudAMQP
95
- **Vector DB:** Pinecone, Weaviate, Qdrant, Chroma
96
- **LLM APIs:** OpenAI, Anthropic, Google AI, Groq, Together AI, Ollama
97
- **SMS:** Twilio, Vonage, MessageBird
98
- **Feature Flags:** LaunchDarkly, Statsig, Flagsmith, Unleash
99
- **Cron:** Inngest, Trigger.dev, QStash, Vercel Cron, Cloudflare Cron
100
- **PDF / OCR (via solve_task):** Surya, Tesseract 5, Google Document AI
101
-
102
- ## /solve/ Tasks Available
103
-
104
- | Slug | Top pick | Corpus | Categories |
105
- |------|----------|--------|-----------|
106
- | `pdf-text-extraction-mcp` | Surya | 10 Brazilian docs incl. NFS-e, boleto, phone-photo receipts | pdf-processing, ocr, agent-tools |
107
-
108
- More `/solve/` rankings added as walkthroughs run. Each page includes its reproducible command so you can re-run the eval yourself.
109
-
110
- ## Data Quality
111
-
112
- - **/solve/ evals:** reproducible corpus + harness + scoring per task. Ground truth is LLM-drafted, human-finalized. Published commands can be re-run locally.
113
- - **Cloud-service pricing:** Chrome-verified (actual service websites, not training data). Updated through 2026-04.
114
- - **Trust scores:** 50+ agent runs across 8 iterations; 47 category aliases; 27 compatibility rules.
115
-
116
- ## Constraints You Can Use on `recommend_service`
117
-
118
- | Constraint | Example |
119
- |-----------|---------|
120
- | Framework | `framework: "nextjs"`, `"sveltekit"`, `"fastapi"`, `"express"` |
121
- | Budget | `budget: "free"`, `"cheap"`, `"enterprise"` |
122
- | Region | `region: "eu"` |
123
- | GDPR | `constraints: "GDPR"` |
124
- | Edge | `constraints: "edge, zero cold starts, cloudflare workers"` |
125
- | Lock-in | `constraints: "no vendor lock-in, portable"` |
126
- | Features | `constraints: "branching, webhooks, inbound email"` |
127
-
128
- ## Privacy
129
-
130
- The MCP server pings `auxiliar.ai/api/` on each tool call for analytics. Only query parameters are sent (e.g., `?need=database&framework=nextjs` or `?task_slug=pdf-text-extraction-mcp`). No personal data, no API keys, no project info. Works offline with bundled data if the ping fails.
131
-
132
23
  ## Links
133
24
 
134
- - [auxiliar.ai](https://auxiliar.ai) — the comparison site with service entries and `/solve/` task rankings
135
- - [/solve/pdf-text-extraction-mcp](https://auxiliar.ai/solve/pdf-text-extraction-mcp/) — the OCR walkthrough
136
- - [GitHub](https://github.com/Tlalvarez/Auxiliar-ai) — source + reproducible eval harness under `scripts/ocr-walkthrough/`
25
+ - [auxiliar.ai](https://auxiliar.ai) — the gateway: API keys, docs, and pricing
26
+ - [GitHub](https://github.com/Tlalvarez/Auxiliar-ai) — source
137
27
 
138
28
  ## License
139
29
 
@@ -0,0 +1,10 @@
1
+ export declare const ABOUT: {
2
+ readonly product: "auxiliar.ai — web-access API gateway for AI agents";
3
+ readonly what_it_does: "Search, scrape, extract, and crawl the live web across many providers through one billed API. Upstream provider keys are injected server-side, so the agent never handles them; usage is credit-metered against your auxiliar account.";
4
+ readonly status: "The in-loop MCP client that wraps these capabilities is being rebuilt (v1.0). This package is currently a pointer during that transition.";
5
+ readonly how_to_use_today: "Get an API key at https://auxiliar.ai, then call the gateway directly over HTTP with your bearer token (one endpoint per capability).";
6
+ readonly links: {
7
+ readonly home: "https://auxiliar.ai";
8
+ readonly source: "https://github.com/Tlalvarez/Auxiliar-ai";
9
+ };
10
+ };
package/dist/about.js ADDED
@@ -0,0 +1,16 @@
1
+ // The single source of truth for what `about_auxiliar` returns.
2
+ //
3
+ // auxiliar.ai is a web-access API gateway for AI agents. The in-loop MCP
4
+ // client that wraps the gateway's capabilities is being rebuilt for v1.0;
5
+ // until then this package ships one informational tool that points the
6
+ // agent at the gateway.
7
+ export const ABOUT = {
8
+ product: "auxiliar.ai — web-access API gateway for AI agents",
9
+ what_it_does: "Search, scrape, extract, and crawl the live web across many providers through one billed API. Upstream provider keys are injected server-side, so the agent never handles them; usage is credit-metered against your auxiliar account.",
10
+ status: "The in-loop MCP client that wraps these capabilities is being rebuilt (v1.0). This package is currently a pointer during that transition.",
11
+ how_to_use_today: "Get an API key at https://auxiliar.ai, then call the gateway directly over HTTP with your bearer token (one endpoint per capability).",
12
+ links: {
13
+ home: "https://auxiliar.ai",
14
+ source: "https://github.com/Tlalvarez/Auxiliar-ai",
15
+ },
16
+ };
package/dist/server.js CHANGED
@@ -1,181 +1,23 @@
1
1
  #!/usr/bin/env node
2
2
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
3
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
- import { z } from "zod";
5
- import { recommendService } from "./tools/recommend.js";
6
- import { setupService } from "./tools/setup.js";
7
- import { checkCompatibility } from "./tools/compatibility.js";
8
- import { getPricing } from "./tools/pricing.js";
9
- import { getRisks } from "./tools/risks.js";
10
- import { listServices } from "./tools/list.js";
11
- import { solveTask, listSolveTasks } from "./tools/solve.js";
12
- import { findCapability } from "./tools/find-capability.js";
13
- import { getCapability } from "./tools/get-capability.js";
14
- import { listCapabilities } from "./tools/list-capabilities.js";
15
- import { compareCapabilities } from "./tools/compare-capabilities.js";
16
- import { invokeCapability } from "./tools/invoke-capability.js";
4
+ import { ABOUT } from "./about.js";
17
5
  const server = new McpServer({
18
6
  name: "auxiliar",
19
- version: "0.13.2",
20
- });
21
- // Tool: recommend_service
22
- server.tool("recommend_service", "Get a current, verified recommendation for a cloud service based on your constraints. Returns pricing, risks, provision commands, and alternatives. Data is Chrome-verified from actual service websites (not stale training data).", {
23
- need: z.string().max(100).describe("What kind of service you need (database, email, auth, deploy, payments, search, cms, storage, monitoring, cache, queues, vector, llm, sms, feature-flags, cron, pdf-extraction — aliases like 'llm-api', 'file-storage', 'vector-db', 'ocr', 'document-ai', 'invoice-extraction', 'nfs-e' also work)"),
24
- framework: z.string().max(100).optional().describe("Your framework (nextjs, express, sveltekit, etc.)"),
25
- region: z.string().max(50).optional().describe("Preferred region (us, eu, etc.)"),
26
- budget: z.enum(["free", "cheap", "moderate", "enterprise"]).optional().describe("Budget constraint"),
27
- constraints: z.string().max(500).optional().describe("Any other constraints (e.g., 'GDPR', 'no vendor lock-in', 'already on AWS')"),
28
- }, async (params) => {
29
- const result = await recommendService(params);
30
- return {
31
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
32
- };
33
- });
34
- // Tool: get_pricing
35
- server.tool("get_pricing", "Get current, Chrome-verified pricing for a specific service. This data comes from actually browsing the service's pricing page (including JS-rendered pages that WebFetch can't read). More current than training data.", {
36
- service: z.string().max(100).describe("Service slug (e.g., 'neon', 'resend', 'clerk', 'supabase', 'stripe', 'vercel')"),
37
- }, async (params) => {
38
- const result = await getPricing(params);
39
- return {
40
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
41
- };
42
- });
43
- // Tool: get_risks
44
- server.tool("get_risks", "Get current risk flags, gotchas, and recent breaking changes for a service. Warns about things like removed free tiers, deprecated libraries, pricing changes, and known issues that training data doesn't cover.", {
45
- service: z.string().max(100).describe("Service slug (e.g., 'neon', 'clerk', 'sendgrid', 'authjs')"),
46
- }, async (params) => {
47
- const result = await getRisks(params);
48
- return {
49
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
50
- };
51
- });
52
- // Tool: check_compatibility
53
- server.tool("check_compatibility", "Check if a set of services are compatible with each other. Warns about known conflicts, integration issues, or gotchas when using services together (e.g., Turso+Prisma needs adapter, Clerk doesn't support SvelteKit well).", {
54
- services: z.array(z.string().max(100)).max(20).describe("List of services to check (e.g., ['neon', 'better-auth', 'vercel'])"),
55
- framework: z.string().max(100).optional().describe("Your framework"),
56
- }, async (params) => {
57
- const result = await checkCompatibility(params);
58
- return {
59
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
60
- };
61
- });
62
- // Tool: setup_service
63
- server.tool("setup_service", "Get step-by-step setup instructions for a service, including CLI commands (if available), signup URL, required env vars, and estimated time. Does NOT automate signup — gives you the exact steps to follow.", {
64
- provider: z.string().max(100).describe("The service provider (neon, resend, supabase, vercel, clerk, stripe, better-auth, etc.)"),
65
- projectName: z.string().max(100).optional().describe("Name for the project/database"),
66
- region: z.string().max(50).optional().describe("Preferred region"),
67
- }, async (params) => {
68
- const result = await setupService(params);
69
- return {
70
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
71
- };
72
- });
73
- // Tool: list_services
74
- server.tool("list_services", "List all available services and categories. Use without parameters to see all categories, or specify a category to see its services.", {
75
- category: z.string().max(100).optional().describe("Category to list services for (e.g., 'database', 'auth', 'email'). Aliases like 'db', 'authentication', 'mail' also work. Omit to see all categories."),
76
- }, async (params) => {
77
- const result = await listServices(params);
78
- return {
79
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
80
- };
81
- });
82
- // Tool: solve_task
83
- server.tool("solve_task", "Fetch the full /solve/ task ranking for a specific job-to-be-done (e.g., 'extract text from PDFs', 'parse Brazilian NFS-e invoices'). Returns the ranked candidates with install commands, an evaluated scorecard (word accuracy, layout, latency, cost, install friction), alternatives considered and dropped, FAQs, and methodological caveats. Use this when an agent needs to pick an installable tool (skill/MCP/API/local binary) for a task rather than a cloud service. Data comes from a reproducible eval run on a real-world corpus — not training data.", {
84
- task_slug: z.string().max(100).optional().describe("Task slug (e.g., 'pdf-text-extraction-mcp', 'nfs-e-extraction', 'cnpj-enrichment-mcp'). Aliases that resolve automatically: 'pdf', 'ocr', 'pdf-ocr', 'document-ai', 'invoice-extraction', 'boleto', 'receipt-parsing', 'bookkeeping-ocr' (→ PDF OCR ranking); 'nfs-e', 'nfse', 'nota-fiscal', 'nota-fiscal-eletronica', 'brazilian-invoice', 'cnpj-invoice' (→ NFS-e structured extraction); 'cnpj', 'cnae', 'cnpj-cnae', 'cnpj-to-cnae', 'regime-tributario', 'regime-tributário', 'cnpj-regime-tributario', 'simples-nacional', 'mei', 'tax-registry', 'tax-registry-enrichment', 'cnpj-enrichment', 'razao-social', 'razão-social' (→ CNPJ tax-registry enrichment). Call list_solve_tasks first if you don't know the slug."),
85
- category: z.string().max(100).optional().describe("Filter by task category (e.g., 'ocr', 'pdf-processing', 'agent-tools'). Returns all matching tasks."),
86
- }, async (params) => {
87
- const result = await solveTask(params);
88
- return {
89
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
90
- };
91
- });
92
- // Tool: list_solve_tasks
93
- server.tool("list_solve_tasks", "List all available /solve/ task rankings with their top picks. Use this to discover what jobs-to-be-done auxiliar.ai has evaluated installable tools for. Complementary to list_services (cloud services catalog): list_solve_tasks surfaces agent-installable tooling (skills, MCPs, APIs, local binaries) evaluated on real-world corpora.", {}, async () => {
94
- const result = await listSolveTasks();
95
- return {
96
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
97
- };
7
+ version: "0.22.1",
98
8
  });
99
9
  // ─────────────────────────────────────────────────────────────────────────
100
- // N1 Phase 6 — unified Capability tools.
10
+ // Transitional surface.
101
11
  //
102
- // Prefer these for new agents. They query the same canonical Capability
103
- // index that drives auxiliar.ai's /service/, /solve/, /skill/, /mcp/,
104
- // /plugin/, /data/, /compare/ pages one shape across every kind of
105
- // thing an agent can install or invoke.
106
- //
107
- // The legacy tools above (recommend_service, solve_task, list_services,
108
- // list_solve_tasks, get_pricing, get_risks, setup_service,
109
- // check_compatibility) remain wired and continue to work; they wrap the
110
- // same legacy data sources they always have, and will be removed in a
111
- // future major version once consumers cut over.
12
+ // auxiliar.ai is now a web-access API gateway for AI agents (search /
13
+ // scrape / extract / crawl across many providers through one billed API,
14
+ // upstream keys injected server-side). The in-loop MCP client that wraps
15
+ // those capabilities is being rebuilt for v1.0. Until then this package
16
+ // ships a single informational tool that points the agent at the gateway.
112
17
  // ─────────────────────────────────────────────────────────────────────────
113
- // Tool: find_capability
114
- server.tool("find_capability", "Unified discovery across every Capability on auxiliar.ai — cloud services, skills, MCP servers, plugins, parsers, installable tools, public-data lookups, task templates. Replaces recommend_service + solve_task + the future find_skill / find_mcp / find_plugin. Pass a free-text query, or specify jtbd (jobs-to-be-done tag), element_type, and/or agent_context to narrow the result. Returns a ranked list with id, page_url, install command, eval score, and jtbd tags. Use get_capability(id) to fetch the full record.", {
115
- query: z.string().max(200).optional().describe("Free-text query — what the agent is trying to do (e.g., 'Brazilian invoice extraction', 'serverless postgres with branching', 'ocr')"),
116
- jtbd: z.array(z.string().max(60)).max(10).optional().describe("Jobs-to-be-done tags. Capabilities matching at least one tag get a strong score boost. Example: ['nfs-e-extraction', 'bookkeeping']"),
117
- element_type: z.enum([
118
- "cloud_service", "installable_tool", "skill", "mcp", "plugin",
119
- "parser", "hook", "prompt", "data", "task_template",
120
- ]).optional().describe("Restrict to one Capability kind"),
121
- agent_context: z.string().max(60).optional().describe("Agent host name (claude-code, cursor, claude-desktop, openclaw). Excludes Capabilities verified-incompatible with that host; includes those marked compatible OR not yet evaluated."),
122
- max_results: z.number().int().min(1).max(50).optional().describe("Max results to return (default 10, max 50)"),
123
- include_experimental: z.boolean().optional().describe("Include records with experimental=true (default false). Experimental records are ingested from external sources (MCP Registry, Printing Press, etc.) but not yet vetted by the curator fleet — filtered out by default to keep ranking clean. Set true for curator/enrichment dogfooding."),
124
- }, async (params) => {
125
- const result = await findCapability(params);
126
- return {
127
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
128
- };
129
- });
130
- // Tool: get_capability
131
- server.tool("get_capability", "Fetch the full Capability record by stable slug. Returns every field — pricing tiers, risks, install spec, dependencies, eval records, distribution surfaces, choose_if/avoid_if. Use after find_capability narrows the candidate set, or when the agent already has a known slug from a /solve/ page or prior session.", {
132
- id: z.string().max(100).describe("Capability id / stable slug (e.g., 'neon', 'auxiliar-nfs-e', 'pdf-text-extraction-mcp')"),
133
- }, async (params) => {
134
- const result = await getCapability(params);
135
- return {
136
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
137
- };
138
- });
139
- // Tool: list_capabilities
140
- server.tool("list_capabilities", "Filtered enumeration of the Capability index. Replaces list_services + list_solve_tasks — element_type discriminates instead of routing through separate tools. Filters compose (AND): a Capability must match every specified filter. With no filters, returns the full index sorted by name.", {
141
- element_type: z.enum([
142
- "cloud_service", "installable_tool", "skill", "mcp", "plugin",
143
- "parser", "hook", "prompt", "data", "task_template",
144
- ]).optional().describe("Restrict to one Capability kind"),
145
- category: z.string().max(60).optional().describe("Legacy category match (e.g., 'database', 'email', 'ocr')"),
146
- jtbd: z.string().max(60).optional().describe("Single jtbd_tag — exact match required"),
147
- agent_context: z.string().max(60).optional().describe("Exclude Capabilities verified-incompatible with this agent host"),
148
- }, async (params) => {
149
- const result = await listCapabilities(params);
150
- return {
151
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
152
- };
153
- });
154
- // Tool: compare_capabilities
155
- server.tool("compare_capabilities", "Side-by-side comparison structure for 2-5 Capabilities. Returns each Capability's fields aligned in a uniform row-per-field shape — same data backing as the Hugo /compare/<a>-vs-<b>/ pages but JSON-shaped for in-loop consumption. Use after the agent has a small candidate set and needs to choose.", {
156
- ids: z.array(z.string().max(100)).min(2).max(5).describe("Capability ids to compare (2-5). Order is preserved in the output rows."),
157
- }, async (params) => {
158
- const result = await compareCapabilities(params);
159
- return {
160
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
161
- };
162
- });
163
- // Tool: invoke_capability
164
- //
165
- // Phase 3 of the mcp-gov merge. The Capability index has long described
166
- // "what each tool does"; invoke_capability is the channel for *calling*
167
- // them. Routes to api.auxiliar.ai/api/invoke/<slug> where each slug is
168
- // a Python coroutine in backend/sources/<region>/. Returns the standard
169
- // envelope {tool, source_module, elapsed_ms, result}.
170
- server.tool("invoke_capability", "Execute a registered data-plane tool over HTTP. Use this to actually CALL a Capability the agent has discovered via find_capability/get_capability/list_capabilities — fetch a CNPJ, search Lei Rouanet projects, list Brasileirão standings, etc. Pass `tool` as the slug (e.g., 'fetch_cnpj', 'rouanet_projeto_fetch') and `args` as the kwargs dict the underlying function expects. Returns {tool, source_module, elapsed_ms, result}. LOW-sensitivity tools work without auth — set AUXILIAR_GATEWAY_TOKEN for HIGH_PII tools (CPF dossiê, judicial process by CPF, etc.) and for higher rate limits. Caching, rate limits, and retries are handled server-side.", {
171
- tool: z.string().max(100).describe("Tool slug — the function name in the gateway registry (e.g., 'fetch_cnpj', 'rouanet_projeto_fetch', 'br_futebol_brasileirao_tabela'). Lowercase, underscore-separated, must start with a letter."),
172
- args: z.record(z.string(), z.unknown()).optional().describe("Keyword arguments for the tool. Pass an empty object for no-arg tools. Unknown args return 400; missing required args return 400."),
173
- }, async (params) => {
174
- const result = await invokeCapability(params);
175
- return {
176
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
177
- };
178
- });
18
+ server.tool("about_auxiliar", "Describe what auxiliar.ai is and how an agent uses it today. auxiliar.ai is a web-access API gateway: search, scrape, extract, and crawl the live web across many providers through one billed API, with upstream keys injected server-side. Call this to learn how to get an API key and reach the gateway. (The in-loop web-access tools are in active development for v1.0.)", {}, async () => ({
19
+ content: [{ type: "text", text: JSON.stringify(ABOUT, null, 2) }],
20
+ }));
179
21
  async function main() {
180
22
  const transport = new StdioServerTransport();
181
23
  await server.connect(transport);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "auxiliar-mcp",
3
- "version": "0.18.0",
4
- "description": "Unified Capability index for AI agents — 80+ ranked cloud services, skills, MCP servers, plugins, parsers, and public-data sources for Claude Code, Cursor, Claude Desktop, OpenClaw. Call find_capability with a query or jtbd tag to get a ranked list across every kind of agent-installable thing. Also: get_capability, list_capabilities, compare_capabilities. Legacy tools (recommend_service, solve_task, list_services, list_solve_tasks, get_pricing, get_risks, setup_service, check_compatibility) remain wired for backward compatibility.",
3
+ "version": "0.22.1",
4
+ "description": "Web access for AI agents — search, scrape, extract, and crawl across many providers through one billed API, upstream keys injected server-side. In-loop MCP client for the auxiliar.ai gateway; client surface in active development for v1.0.",
5
5
  "type": "module",
6
6
  "main": "dist/server.js",
7
7
  "bin": {
@@ -12,8 +12,7 @@
12
12
  "README.md"
13
13
  ],
14
14
  "scripts": {
15
- "build:data": "node --import tsx scripts/build-capabilities.mjs",
16
- "build": "npm run build:data && tsc && chmod +x dist/server.js",
15
+ "build": "rm -rf dist && tsc && chmod +x dist/server.js",
17
16
  "test": "node --import tsx test.ts",
18
17
  "dev": "tsc --watch",
19
18
  "start": "node dist/server.js",
@@ -28,33 +27,16 @@
28
27
  "claude-code",
29
28
  "claude-desktop",
30
29
  "cursor",
31
- "windsurf",
32
30
  "openclaw",
33
- "clawhub",
34
- "ocr",
35
- "pdf",
36
- "pdf-extraction",
37
- "pdf-ocr",
38
- "document-ai",
39
- "invoice-extraction",
40
- "nfs-e",
41
- "boleto",
42
- "bookkeeping",
43
- "brazilian-invoice",
44
- "receipt-parsing",
45
- "solve-task",
46
- "task-ranking",
47
- "agent-tools",
48
- "agent-skills",
49
- "tool-selection",
50
- "agent-upgrade",
51
- "cloud-services",
52
- "pricing",
53
- "developer-tools",
54
- "infrastructure",
55
- "surya",
56
- "tesseract",
57
- "google-document-ai"
31
+ "web-access",
32
+ "web-search",
33
+ "search-api",
34
+ "scraping",
35
+ "web-scraping",
36
+ "crawler",
37
+ "extract",
38
+ "gateway",
39
+ "api-gateway"
58
40
  ],
59
41
  "license": "MIT",
60
42
  "repository": {
@@ -67,13 +49,11 @@
67
49
  "node": ">=18.0.0"
68
50
  },
69
51
  "dependencies": {
70
- "@modelcontextprotocol/sdk": "^1.12.1",
71
- "zod": "^4.3.6"
52
+ "@modelcontextprotocol/sdk": "^1.12.1"
72
53
  },
73
54
  "devDependencies": {
74
55
  "@types/node": "^22.0.0",
75
56
  "tsx": "^4.21.0",
76
- "typescript": "^5.8.0",
77
- "yaml": "^2.8.3"
57
+ "typescript": "^5.8.0"
78
58
  }
79
59
  }
@@ -1,34 +0,0 @@
1
- /**
2
- * Runtime query layer over the unified Capability index (N1 Phase 3).
3
- *
4
- * Loads the build-time snapshot at `./capabilities.generated.json` (built by
5
- * `mcp/scripts/build-capabilities.mjs` from `data/capabilities/*.yml`) and
6
- * exposes a small functional API for the MCP server tools.
7
- *
8
- * The snapshot is validated through the Zod Capability schema **once at
9
- * module import**. Per-call validation would burn CPU on every tool
10
- * invocation; one-shot validation at startup catches schema/data drift
11
- * before the server handles its first request.
12
- *
13
- * The MCP server runs on the user's machine, not on AWS. Bundling the
14
- * snapshot keeps that path AWS-credentialless. DynamoDB is the runtime
15
- * backing store for the FastAPI side (Hugo build, web visitors, future
16
- * Costco gateway) — both consumers read from `data/capabilities/*.yml`
17
- * as the canonical source.
18
- */
19
- import { Capability } from "../types/capability.js";
20
- /** Return every Capability in the index. Order is YAML filename ascending. */
21
- export declare function listAllCapabilities(): readonly Capability[];
22
- /** Fetch one Capability by stable slug, or undefined if absent. */
23
- export declare function getCapability(id: string): Capability | undefined;
24
- /** All Capabilities of a single element_type. */
25
- export declare function listCapabilitiesByElementType(elementType: Capability["element_type"]): readonly Capability[];
26
- /** Capabilities matching any of the given jtbd_tags (OR semantics). Used by
27
- * the find_capability tool's task-first query path. */
28
- export declare function findCapabilitiesByJtbd(tags: readonly string[]): Capability[];
29
- /** Capabilities matching any of the given category strings. /service/<cat>/
30
- * list views and the legacy `list_services` tool route through here. */
31
- export declare function listCapabilitiesByCategory(category: string): Capability[];
32
- /** Total count — exposed for diagnostics + the homepage's dynamic
33
- * service-count display. */
34
- export declare function capabilityCount(): number;