From 023209478b9592b7dab5b960f14c635f695a3592 Mon Sep 17 00:00:00 2001 From: 7k777 <2162106782@qq.com> Date: Fri, 2 Oct 2026 19:30:12 +0900 Subject: [PATCH 1/2] feat(adapter): add read-only Baserow connector --- .../backend/src/adapters/intl/baserow.json | 135 ++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 packages/backend/src/adapters/intl/baserow.json diff --git a/packages/backend/src/adapters/intl/baserow.json b/packages/backend/src/adapters/intl/baserow.json new file mode 100644 index 00000000..3b95b3c0 --- /dev/null +++ b/packages/backend/src/adapters/intl/baserow.json @@ -0,0 +1,135 @@ +{ + "slug": "baserow", + "name": "Baserow", + "description": "Read Baserow tables, fields, and rows from Baserow Cloud or a self-hosted instance. 4 generic read-only tools using database-token authentication.", + "instructions": "This connector uses Baserow's database API and is read-only.\n\n**Setup**:\n1. In Baserow, open Settings > Database tokens and create a token with read access only to the databases and tables this connector needs.\n2. Set `BASEROW_API_TOKEN` to that token.\n3. Set `BASEROW_URL` to the root Baserow API host, with no trailing slash. For Baserow Cloud use `https://api.baserow.io`. For self-hosted Baserow use your own host, for example `https://baserow.example.com`.\n\n**Authentication**: Baserow database tokens use `Authorization: Token `, not Bearer authentication. This adapter sends the header correctly. Database tokens only work with the database API; some account/workspace endpoints require JWT authentication and are intentionally not exposed here.\n\n**Discovery order**: call `baserow_list_tables` first, then `baserow_list_fields` for the table you want to query. Every Baserow installation has different tables, so the adapter stays generic rather than creating one tool per table.\n\n**Rows**: row tools always send `user_field_names=true`, so responses use human-readable field names instead of keys such as `field_1234`. `baserow_list_rows` supports search plus page/size pagination. Start with page 1 and a modest size; increase only when the task needs more rows.\n\n**Self-hosted instances**: if the Baserow host is private or resolves to private address space, self-host AnythingMCP on the same network and allow the host through `SSRF_ALLOWED_HOSTS`; otherwise the outbound guard may block the request.\n\n**Out of scope**: creating, updating, or deleting rows, fields, tables, databases, or workspace/account objects.", + "region": "intl", + "category": "data", + "icon": "baserow", + "docsUrl": "https://baserow.io/user-docs/database-api", + "requiredEnvVars": [ + "BASEROW_URL", + "BASEROW_API_TOKEN" + ], + "connector": { + "name": "Baserow Database API", + "type": "REST", + "baseUrl": "{{BASEROW_URL}}", + "authType": "API_KEY", + "authConfig": { + "headerName": "Authorization", + "apiKey": "Token {{BASEROW_API_TOKEN}}" + }, + "headers": { + "Accept": "application/json" + }, + "healthcheckPath": "/api/database/tables/all-tables/" + }, + "probe": { + "tool": "baserow_list_tables" + }, + "tools": [ + { + "name": "baserow_list_tables", + "description": "List every table visible to the configured database token. Call this first to discover table IDs and names, for example table id 42 named Tasks.", + "parameters": { + "type": "object", + "properties": {} + }, + "endpointMapping": { + "method": "GET", + "path": "/api/database/tables/all-tables/" + } + }, + { + "name": "baserow_list_fields", + "description": "List the fields in one Baserow table so later row queries can use the real human-readable field names and understand their types.", + "parameters": { + "type": "object", + "properties": { + "table_id": { + "type": "integer", + "description": "Numeric table ID returned by baserow_list_tables, for example 42." + } + }, + "required": [ + "table_id" + ] + }, + "endpointMapping": { + "method": "GET", + "path": "/api/database/fields/table/{table_id}/" + } + }, + { + "name": "baserow_list_rows", + "description": "List rows from one Baserow table using human-readable field names. Supports free-text search and page/size pagination; use baserow_list_fields first when the schema is unknown.", + "parameters": { + "type": "object", + "properties": { + "table_id": { + "type": "integer", + "description": "Numeric table ID returned by baserow_list_tables, for example 42." + }, + "search": { + "type": "string", + "description": "Optional free-text search across searchable fields, for example overdue." + }, + "page": { + "type": "integer", + "description": "1-based page number. Start with 1.", + "minimum": 1, + "default": 1 + }, + "size": { + "type": "integer", + "description": "Number of rows per page. Use a modest page size such as 20 unless more rows are required.", + "minimum": 1, + "default": 20 + } + }, + "required": [ + "table_id" + ] + }, + "endpointMapping": { + "method": "GET", + "path": "/api/database/rows/table/{table_id}/", + "queryParams": { + "user_field_names": true, + "search": "$search", + "page": "$page", + "size": "$size" + } + } + }, + { + "name": "baserow_get_row", + "description": "Get one row by numeric row ID from a Baserow table, returning human-readable field names. Use baserow_list_rows to discover row IDs.", + "parameters": { + "type": "object", + "properties": { + "table_id": { + "type": "integer", + "description": "Numeric table ID returned by baserow_list_tables, for example 42." + }, + "row_id": { + "type": "integer", + "description": "Numeric row ID to retrieve, for example 123." + } + }, + "required": [ + "table_id", + "row_id" + ] + }, + "endpointMapping": { + "method": "GET", + "path": "/api/database/rows/table/{table_id}/{row_id}/", + "queryParams": { + "user_field_names": true + } + } + } + ] +} From b53b060f86ee7d79296aaa5addc5f0803622d9ba Mon Sep 17 00:00:00 2001 From: 77i <2162106782@qq.com> Date: Sat, 3 Oct 2026 01:45:26 +0800 Subject: [PATCH 2/2] test(adapter): validate Baserow adapter and update catalog --- CITATION.cff | 2 +- README.de.md | 6 +++--- README.ja.md | 6 +++--- README.md | 6 +++--- README.zh-CN.md | 6 +++--- glama.json | 2 +- package.json | 2 +- packages/backend/src/adapters/catalog.ts | 2 ++ .../src/adapters/intl/baserow.live.spec.ts | 19 +++++++++++++++++++ server.json | 2 +- 10 files changed, 37 insertions(+), 16 deletions(-) create mode 100644 packages/backend/src/adapters/intl/baserow.live.spec.ts diff --git a/CITATION.cff b/CITATION.cff index d71af617..5098f798 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -13,7 +13,7 @@ abstract: > server that turns REST/OpenAPI, SOAP/WSDL and GraphQL APIs, SQL/NoSQL databases and other MCP servers into tools for AI clients such as Claude, ChatGPT, Google Gemini, GitHub Copilot and Cursor, without writing code. - It ships 265 pre-built adapters, with a focus on ERP and e-commerce + It ships 266 pre-built adapters, with a focus on ERP and e-commerce systems (SAP Business One, Odoo, Xentral, JTL-Wawi, weclapp, Shopware, WooCommerce, Amazon Seller, Kaufland, OTTO, etc.), a per-workspace knowledge graph served over MCP, per-tool response mapping, diff --git a/README.de.md b/README.de.md index 652fe194..0f98c2f5 100644 --- a/README.de.md +++ b/README.de.md @@ -1,5 +1,5 @@

- AnythingMCP macht ERP-, E-Commerce-, REST-, SOAP- und SQL-Systeme zu MCP-Tools für Claude und ChatGPT: 265 Connectors, 21 davon ohne API-Schlüssel. + AnythingMCP macht ERP-, E-Commerce-, REST-, SOAP- und SQL-Systeme zu MCP-Tools für Claude und ChatGPT: 266 Connectors, 21 davon ohne API-Schlüssel.

AnythingMCP: selbst gehostetes MCP-Gateway

@@ -19,7 +19,7 @@

AnythingMCP ist ein quelloffenes, selbst gehostetes MCP-Gateway, das jedes REST-/OpenAPI-, SOAP-, GraphQL-, OData- oder SQL-System in MCP-Tools für Claude, ChatGPT und Copilot verwandelt, ohne dass du einen MCP-Server programmierst.
- Es bringt 265 fertige Adapter mit, darunter SAP, Etsy, weclapp und Amazon Seller; 21 davon kommen ohne API-Schlüssel aus. + Es bringt 266 fertige Adapter mit, darunter SAP, Etsy, weclapp und Amazon Seller; 21 davon kommen ohne API-Schlüssel aus.

@@ -110,7 +110,7 @@ Tools werden zur Laufzeit registriert, ohne Neustart. `{{VAR}}`-Werte pro Connec ## Connector-Katalog -265 Adapter mit über 2.400 Tools. Zu jedem gibt es eine Einrichtungsanleitung auf [anythingmcp.com/de/guides](https://anythingmcp.com/de/guides), in sieben Sprachen. +266 Adapter mit über 2.400 Tools. Zu jedem gibt es eine Einrichtungsanleitung auf [anythingmcp.com/de/guides](https://anythingmcp.com/de/guides), in sieben Sprachen. | Kategorie | Beispiele | |---|---| diff --git a/README.ja.md b/README.ja.md index 3cbe9081..218addc8 100644 --- a/README.ja.md +++ b/README.ja.md @@ -1,5 +1,5 @@

- AnythingMCP は ERP、E コマース、REST、SOAP、SQL の各システムを Claude と ChatGPT 用の MCP ツールに変換します。265 のコネクター、うち 21 は API キー不要。 + AnythingMCP は ERP、E コマース、REST、SOAP、SQL の各システムを Claude と ChatGPT 用の MCP ツールに変換します。266 のコネクター、うち 21 は API キー不要。

AnythingMCP:セルフホスト型 MCP ゲートウェイ

@@ -19,7 +19,7 @@

AnythingMCP は、オープンソースのセルフホスト型 MCP ゲートウェイです。MCP サーバーを書かずに、REST/OpenAPI、SOAP、GraphQL、OData、SQL のあらゆるシステムを Claude、ChatGPT、Copilot 用の MCP ツールに変換します。
- SAP、Etsy、weclapp、Amazon Seller などを含む 265 種類の既製アダプターを同梱しており、うち 21 は API キー不要です。 + SAP、Etsy、weclapp、Amazon Seller などを含む 266 種類の既製アダプターを同梱しており、うち 21 は API キー不要です。

@@ -110,7 +110,7 @@ amd64 ではイメージの取得に約 30 秒、その 24 秒後に API が利 ## コネクターカタログ -265 個のアダプターで 2,400 以上のツールを提供しています。どのアダプターにも [anythingmcp.com/ja/guides](https://anythingmcp.com/ja/guides) に 7 言語の設定ガイドがあります。 +266 個のアダプターで 2,400 以上のツールを提供しています。どのアダプターにも [anythingmcp.com/ja/guides](https://anythingmcp.com/ja/guides) に 7 言語の設定ガイドがあります。 | カテゴリー | 例 | |---|---| diff --git a/README.md b/README.md index 0079a56b..76e5668b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- AnythingMCP turns ERP, e-commerce, REST, SOAP and SQL systems into MCP tools for Claude and ChatGPT: 265 connectors, 21 of them with no API key. + AnythingMCP turns ERP, e-commerce, REST, SOAP and SQL systems into MCP tools for Claude and ChatGPT: 266 connectors, 21 of them with no API key.

AnythingMCP: self-hosted MCP gateway

@@ -19,7 +19,7 @@

AnythingMCP is an open-source, self-hosted MCP gateway that turns any REST/OpenAPI, SOAP, GraphQL, OData or SQL system into MCP tools for Claude, ChatGPT and Copilot, without writing an MCP server.
- It ships 265 ready connectors, among them SAP, Etsy, weclapp and Amazon Seller, and 21 of them need no API key. + It ships 266 ready connectors, among them SAP, Etsy, weclapp and Amazon Seller, and 21 of them need no API key.

@@ -102,7 +102,7 @@ Tools register at runtime, without a restart. Per-connector `{{VAR}}` values are ## Connector catalog -265 adapters, exposing 2,400+ tools. Every one has a setup guide on [anythingmcp.com/guides](https://anythingmcp.com/guides), in seven languages. +266 adapters, exposing 2,400+ tools. Every one has a setup guide on [anythingmcp.com/guides](https://anythingmcp.com/guides), in seven languages. | Category | Examples | |---|---| diff --git a/README.zh-CN.md b/README.zh-CN.md index 779f97dc..05138cf8 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -1,5 +1,5 @@

- AnythingMCP 将 ERP、电子商务、REST、SOAP 和 SQL 系统转化为 Claude 和 ChatGPT 可用的 MCP 工具:265 个连接器,其中 21 个无需 API 密钥。 + AnythingMCP 将 ERP、电子商务、REST、SOAP 和 SQL 系统转化为 Claude 和 ChatGPT 可用的 MCP 工具:266 个连接器,其中 21 个无需 API 密钥。

AnythingMCP:自行托管的 MCP 网关

@@ -19,7 +19,7 @@

AnythingMCP 是一个开源、可自行托管的 MCP 网关,无需编写 MCP 服务器,即可将任意 REST/OpenAPI、SOAP、GraphQL、OData 或 SQL 系统转化为 Claude、ChatGPT 和 Copilot 可用的 MCP 工具。
- 它自带 265 个现成适配器,涵盖 SAP、Etsy、weclapp 和 Amazon Seller 等,其中 21 个无需 API 密钥。 + 它自带 266 个现成适配器,涵盖 SAP、Etsy、weclapp 和 Amazon Seller 等,其中 21 个无需 API 密钥。

@@ -110,7 +110,7 @@ docker compose up -d ## 连接器目录 -共 265 个适配器,提供 2,400 多个工具。每个适配器都在 [anythingmcp.com/zh/guides](https://anythingmcp.com/zh/guides) 上提供七种语言的配置指南。 +共 266 个适配器,提供 2,400 多个工具。每个适配器都在 [anythingmcp.com/zh/guides](https://anythingmcp.com/zh/guides) 上提供七种语言的配置指南。 | 类别 | 示例 | |---|---| diff --git a/glama.json b/glama.json index 22d16b5a..bb1d7566 100644 --- a/glama.json +++ b/glama.json @@ -3,5 +3,5 @@ "maintainers": [ "keysersoft" ], - "description": "Turn any REST/OpenAPI, SOAP/WSDL, GraphQL, OData or SQL API into MCP tools for Claude, ChatGPT and Copilot, no code. 265 pre-built adapters for ERP and e-commerce (SAP S/4HANA, SAP Business One, Odoo, Xentral, JTL-Wawi, weclapp, Shopware, WooCommerce, Amazon Seller, Kaufland, OTTO\u2026) and more. Self-hosted, knowledge graph, per-tool response mapping, OAuth2/RBAC/SSO/audit. Open source under AGPL-3.0." + "description": "Turn any REST/OpenAPI, SOAP/WSDL, GraphQL, OData or SQL API into MCP tools for Claude, ChatGPT and Copilot, no code. 266 pre-built adapters for ERP and e-commerce (SAP S/4HANA, SAP Business One, Odoo, Xentral, JTL-Wawi, weclapp, Shopware, WooCommerce, Amazon Seller, Kaufland, OTTO\u2026) and more. 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 57e9f43c..e63b3a8f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "anythingmcp", "version": "0.16.1", - "description": "Turn any REST/OpenAPI, SOAP/WSDL, GraphQL, OData or SQL API into MCP tools for Claude, ChatGPT and Copilot, no code. 265 pre-built adapters for ERP, e-commerce and more (SAP S/4HANA, SAP Business One, Odoo, Xentral, JTL-Wawi, Shopware, WooCommerce, Amazon Seller). Self-hosted, open source (AGPL-3.0).", + "description": "Turn any REST/OpenAPI, SOAP/WSDL, GraphQL, OData or SQL API into MCP tools for Claude, ChatGPT and Copilot, no code. 266 pre-built adapters for ERP, e-commerce and more (SAP S/4HANA, SAP Business One, Odoo, Xentral, JTL-Wawi, Shopware, WooCommerce, Amazon Seller). 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 da015732..40988bc4 100644 --- a/packages/backend/src/adapters/catalog.ts +++ b/packages/backend/src/adapters/catalog.ts @@ -73,6 +73,7 @@ import * as apollo from './intl/apollo.json'; import * as attio from './intl/attio.json'; import * as bamboohr from './intl/bamboohr.json'; import * as basecamp from './intl/basecamp.json'; +import * as baserow from './intl/baserow.json'; import * as beehiiv from './intl/beehiiv.json'; import * as bigcommerce from './intl/bigcommerce.json'; import * as bitrix24 from './intl/bitrix24.json'; @@ -496,6 +497,7 @@ const RAW_ADAPTERS: AdapterDefinition[] = [ attio as unknown as AdapterDefinition, bamboohr as unknown as AdapterDefinition, basecamp as unknown as AdapterDefinition, + baserow as unknown as AdapterDefinition, beehiiv as unknown as AdapterDefinition, bigcommerce as unknown as AdapterDefinition, bitrix24 as unknown as AdapterDefinition, diff --git a/packages/backend/src/adapters/intl/baserow.live.spec.ts b/packages/backend/src/adapters/intl/baserow.live.spec.ts new file mode 100644 index 00000000..e202cc22 --- /dev/null +++ b/packages/backend/src/adapters/intl/baserow.live.spec.ts @@ -0,0 +1,19 @@ +import { describe, it, expect } from '@jest/globals'; +import * as adapter from './baserow.json'; + +const a = adapter as unknown as { + connector: { + baseUrl: string; + authType: string; + authConfig: Record; + }; +}; +describe('baserow adapter — static spec conformance', () => { + it('uses BASEROW_URL', () => + expect(a.connector.baseUrl).toBe('{{BASEROW_URL}}')); + it('Token auth', () => { + expect(a.connector.authType).toBe('API_KEY'); + expect(a.connector.authConfig.headerName).toBe('Authorization'); + expect(a.connector.authConfig.apiKey).toBe('Token {{BASEROW_API_TOKEN}}'); + }); +}); diff --git a/server.json b/server.json index b099fde2..20944d62 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": "Any REST/SOAP/GraphQL/OData/SQL API as MCP tools for Claude & ChatGPT. 265 connectors: SAP, ERP.", + "description": "Any REST/SOAP/GraphQL/OData/SQL API as MCP tools for Claude & ChatGPT. 266 connectors: SAP, ERP.", "repository": { "url": "https://github.com/HelpCode-ai/anythingmcp", "source": "github"