diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 43da2cd8..633b0458 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -5,7 +5,7 @@ contact_links: about: For anything that isn't a clear bug or feature request — please use Discussions so the answer helps everyone else too. - name: 📚 Documentation & Guides url: https://anythingmcp.com - about: Setup guides for all 189 adapters and every AI client, in seven languages. + about: Setup guides for all 190 adapters and every AI client, in seven languages. - name: 🔐 Security vulnerabilities url: https://github.com/HelpCode-ai/anythingmcp/blob/main/SECURITY.md about: Please do NOT open a public issue. Follow the security disclosure policy. diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 2a7b49ce..6cc8c79c 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -65,7 +65,7 @@ jobs: readme-filepath: ./README.md # Docker Hub caps this at 100 characters and shows it in search # results; the repo's was left at the truncated default. - short-description: "189 connectors + any REST/SOAP/GraphQL/SQL as MCP tools for Claude & ChatGPT. Self-hosted, AGPL." + short-description: "190 connectors + any REST/SOAP/GraphQL/SQL as MCP tools for Claude & ChatGPT. Self-hosted, AGPL." - name: Set Docker Hub categories env: diff --git a/CITATION.cff b/CITATION.cff index e7a223b3..4278f47a 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -13,7 +13,7 @@ abstract: > server that exposes REST, SOAP/WSDL and GraphQL APIs, SQL/NoSQL databases and other MCP servers as tools for AI clients such as Claude, ChatGPT, Google Gemini, GitHub Copilot and Cursor, without writing code. It ships - 189 pre-built adapters (Deutsche Bahn, DATEV, weclapp, DHL, Shopware, + 190 pre-built adapters (Deutsche Bahn, DATEV, weclapp, DHL, Shopware, Personio, Handelsregister, etc.), a per-workspace knowledge graph served over MCP, per-tool response mapping, OAuth2/RBAC/SSO/SCIM governance, an audit log and a visual tool editor. diff --git a/README.md b/README.md index 2a6b415a..916baf14 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@

- AnythingMCP — 189 connectors, 20 of them with no API key. Your REST, SOAP/WSDL, GraphQL, SQL and MCP systems become tools for Claude, ChatGPT, Copilot and Gemini. + AnythingMCP — 190 connectors, 20 of them with no API key. Your REST, SOAP/WSDL, GraphQL, SQL and MCP systems become tools for Claude, ChatGPT, Copilot and Gemini.

AnythingMCP

Give Claude, ChatGPT and Copilot safe access to the software your company already runs.
- 189 ready adapters, any REST/SOAP/GraphQL/SQL system without code, on your own infrastructure — and it learns how your systems connect. + 190 ready adapters, any REST/SOAP/GraphQL/SQL system without code, on your own infrastructure — and it learns how your systems connect.

@@ -36,7 +36,7 @@ docker compose up -d # → http://localhost:3000 Three words appear throughout and mean three different things: -- an **adapter** is one of the 189 JSON definitions that ship in this repo — DATEV, weclapp, DHL, Deutsche Bahn, Shopware, Personio, Handelsregister and the rest. 20 of them need no API key at all; the others ask for your credentials at import. +- an **adapter** is one of the 190 JSON definitions that ship in this repo — DATEV, weclapp, DHL, Deutsche Bahn, Shopware, Personio, Handelsregister and the rest. 20 of them need no API key at all; the others ask for your credentials at import. - a **connector** is an adapter, or your own OpenAPI spec / Postman collection / WSDL / GraphQL endpoint / database, once you have configured it in your workspace. Anything you can point at, in minutes, without writing an MCP server. - an **MCP server** is the URL you hand to Claude. It exposes the connectors you assign to it, and nothing else. @@ -260,7 +260,7 @@ AI clients speak MCP, but your systems speak REST, SOAP, GraphQL and SQL. Writin ## The adapter catalog -189 adapters, exposing 1,800+ tools. **20 need no API key**; the rest ask for your credentials at import and the tools are available immediately. Every one has a setup guide on [anythingmcp.com/guides](https://anythingmcp.com/guides), in seven languages. +190 adapters, exposing 1,800+ tools. **20 need no API key**; the rest ask for your credentials at import and the tools are available immediately. Every one has a setup guide on [anythingmcp.com/guides](https://anythingmcp.com/guides), in seven languages. | Category | Examples | |---|---| diff --git a/glama.json b/glama.json index c01899d9..dd4813b7 100644 --- a/glama.json +++ b/glama.json @@ -3,5 +3,5 @@ "maintainers": [ "keysersoft" ], - "description": "Give Claude, ChatGPT and Copilot safe access to the software your company already runs. 189 pre-built adapters (Deutsche Bahn, DATEV, weclapp, DHL, Shopware, Personio\u2026) plus any REST, SOAP/WSDL, GraphQL or SQL system as MCP tools, no code. Self-hosted, knowledge graph, per-tool response mapping, OAuth2/RBAC/SSO/audit. Open source under AGPL-3.0." + "description": "Give Claude, ChatGPT and Copilot safe access to the software your company already runs. 190 pre-built adapters (Deutsche Bahn, DATEV, weclapp, DHL, Shopware, Personio\u2026) plus any REST, SOAP/WSDL, GraphQL or SQL system as MCP tools, no code. Self-hosted, knowledge graph, per-tool response mapping, OAuth2/RBAC/SSO/audit. Open source under AGPL-3.0." } diff --git a/package.json b/package.json index b6ae7422..e83c5c25 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "anythingmcp", "version": "0.9.0", - "description": "Give Claude, ChatGPT and Copilot safe access to the software your company already runs. 189 pre-built adapters plus any REST, SOAP/WSDL, GraphQL or SQL system as MCP tools, no code. Self-hosted, open source (AGPL-3.0).", + "description": "Give Claude, ChatGPT and Copilot safe access to the software your company already runs. 190 pre-built adapters plus any REST, SOAP/WSDL, GraphQL or SQL system as MCP tools, no code. Self-hosted, open source (AGPL-3.0).", "private": true, "license": "AGPL-3.0-only", "engines": { diff --git a/packages/backend/src/adapters/catalog.ts b/packages/backend/src/adapters/catalog.ts index 70512ba6..3ee6efdb 100644 --- a/packages/backend/src/adapters/catalog.ts +++ b/packages/backend/src/adapters/catalog.ts @@ -41,6 +41,7 @@ import * as activecampaign from './intl/activecampaign.json'; import * as acuityScheduling from './intl/acuity-scheduling.json'; import * as adyen from './intl/adyen.json'; import * as agilecrm from './intl/agilecrm.json'; +import * as airtable from './intl/airtable.json'; import * as amadeus from './intl/amadeus.json'; import * as amazonSeller from './intl/amazon-seller.json'; import * as apiFootball from './intl/api-football.json'; @@ -346,6 +347,7 @@ const RAW_ADAPTERS: AdapterDefinition[] = [ acuityScheduling as unknown as AdapterDefinition, adyen as unknown as AdapterDefinition, agilecrm as unknown as AdapterDefinition, + airtable as unknown as AdapterDefinition, amadeus as unknown as AdapterDefinition, amazonSeller as unknown as AdapterDefinition, apiFootball as unknown as AdapterDefinition, diff --git a/packages/backend/src/adapters/intl/airtable.json b/packages/backend/src/adapters/intl/airtable.json new file mode 100644 index 00000000..dfcf2941 --- /dev/null +++ b/packages/backend/src/adapters/intl/airtable.json @@ -0,0 +1,125 @@ +{ + "slug": "airtable", + "name": "Airtable", + "description": "Read Airtable bases, table schemas, and records from any AI agent. 4 read-only tools, Personal Access Token auth.", + "instructions": "This connector uses the Airtable Web API v0 and is read-only.\n\n**Setup**:\n1. Create a Personal Access Token at https://airtable.com/create/tokens.\n2. Grant only the `data.records:read` and `schema.bases:read` scopes.\n3. Restrict the token's access to only the bases this connector must read.\n4. Set `AIRTABLE_PERSONAL_ACCESS_TOKEN`.\n\n**Authentication**: `Authorization: Bearer ${AIRTABLE_PERSONAL_ACCESS_TOKEN}`. Use a scoped Personal Access Token, not a legacy API key.\n\n**Discovery order**: call `airtable_list_bases`, then `airtable_list_tables` with a base ID to find table IDs, names, fields, and views. Use a table ID when possible because names can change.\n\n**Records**: `airtable_list_records` returns one page and may include an `offset`. Pass that `offset` to the next call until it is absent. `pageSize` is 1-100; `maxRecords` limits the total records Airtable returns.\n\n**Filtering**: `filterByFormula` uses Airtable formula syntax. For example, `{Status}=\"Active\"` returns records whose Status field is Active. A view can apply saved filters and sorting; combine it with a formula only when both restrictions are intended.\n\n**Out of scope here**: creating, updating, deleting, or otherwise modifying bases, tables, fields, views, or records.", + "region": "intl", + "category": "productivity", + "icon": "airtable", + "docsUrl": "https://airtable.com/developers/web/api/introduction", + "requiredEnvVars": ["AIRTABLE_PERSONAL_ACCESS_TOKEN"], + "connector": { + "name": "Airtable Web API v0", + "type": "REST", + "baseUrl": "https://api.airtable.com/v0", + "authType": "BEARER_TOKEN", + "authConfig": { + "token": "{{AIRTABLE_PERSONAL_ACCESS_TOKEN}}" + }, + "healthcheckPath": "/meta/bases" + }, + "tools": [ + { + "name": "airtable_list_bases", + "description": "List bases accessible to the Personal Access Token. Use this first to discover a base ID, for example `appABC123DEF456`.", + "parameters": { "type": "object", "properties": {} }, + "endpointMapping": { + "method": "GET", + "path": "/meta/bases" + } + }, + { + "name": "airtable_list_tables", + "description": "List a base's table schemas, including table IDs, names, fields, and views. Use this to discover a table ID such as `tblABC123DEF456` before reading records.", + "parameters": { + "type": "object", + "properties": { + "baseId": { + "type": "string", + "description": "Base ID from `airtable_list_bases`, for example `appABC123DEF456`." + } + }, + "required": ["baseId"] + }, + "endpointMapping": { + "method": "GET", + "path": "/meta/bases/{baseId}/tables" + } + }, + { + "name": "airtable_list_records", + "description": "List records from a table. The response may include an `offset`; pass it to the next call until it is absent. To filter records, use Airtable formula syntax, for example `filterByFormula: {Status}=\"Active\"`.", + "parameters": { + "type": "object", + "properties": { + "baseId": { + "type": "string", + "description": "Base ID, for example `appABC123DEF456`." + }, + "tableIdOrName": { + "type": "string", + "description": "Table ID or table name, for example `tblABC123DEF456` or `Tasks`. Prefer the table ID returned by `airtable_list_tables`." + }, + "filterByFormula": { + "type": "string", + "description": "Airtable formula that records must satisfy, for example `{Status}=\"Active\"`. Field names are wrapped in braces." + }, + "view": { + "type": "string", + "description": "Saved view name or ID to apply its filters and sorting, for example `Active tasks`." + }, + "pageSize": { + "type": "integer", + "description": "Records per response page, from 1 to 100. For example, `100`." + }, + "maxRecords": { + "type": "integer", + "description": "Maximum total number of records Airtable should return, for example `250`." + }, + "offset": { + "type": "string", + "description": "Pagination cursor from the previous response, for example `itrABC123DEF456`. Omit for the first page." + } + }, + "required": ["baseId", "tableIdOrName"] + }, + "endpointMapping": { + "method": "GET", + "path": "/{baseId}/{tableIdOrName}", + "queryParams": { + "filterByFormula": "$filterByFormula", + "view": "$view", + "pageSize": "$pageSize", + "maxRecords": "$maxRecords", + "offset": "$offset" + } + } + }, + { + "name": "airtable_get_record", + "description": "Get one record by ID from a table, for example record ID `recABC123DEF456`. Use `airtable_list_records` to find record IDs.", + "parameters": { + "type": "object", + "properties": { + "baseId": { + "type": "string", + "description": "Base ID, for example `appABC123DEF456`." + }, + "tableIdOrName": { + "type": "string", + "description": "Table ID or table name, for example `tblABC123DEF456` or `Tasks`." + }, + "recordId": { + "type": "string", + "description": "Record ID, for example `recABC123DEF456`." + } + }, + "required": ["baseId", "tableIdOrName", "recordId"] + }, + "endpointMapping": { + "method": "GET", + "path": "/{baseId}/{tableIdOrName}/{recordId}" + } + } + ] +} diff --git a/server.json b/server.json index e811767c..bde5f46f 100644 --- a/server.json +++ b/server.json @@ -1,7 +1,7 @@ { "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json", "name": "io.github.HelpCode-ai/anythingmcp", - "description": "189 connectors + any REST/SOAP/GraphQL/SQL as MCP tools for Claude & ChatGPT. Self-hosted, AGPL.", + "description": "190 connectors + any REST/SOAP/GraphQL/SQL as MCP tools for Claude & ChatGPT. Self-hosted, AGPL.", "repository": { "url": "https://github.com/HelpCode-ai/anythingmcp", "source": "github"