@rashidazarang/airtable-mcp 3.1.0 → 3.2.8
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/README.md +209 -334
- package/bin/airtable-mcp.js +12 -32
- package/dist/typescript/airtable-mcp-server.js +77 -0
- package/dist/typescript/airtable-mcp-server.js.map +1 -0
- package/dist/typescript/app/airtable-client.js +327 -0
- package/dist/typescript/app/airtable-client.js.map +1 -0
- package/dist/typescript/app/config.js +151 -0
- package/dist/typescript/app/config.js.map +1 -0
- package/dist/typescript/app/context.js +3 -0
- package/dist/typescript/app/context.js.map +1 -0
- package/dist/typescript/app/exceptions.js +85 -0
- package/dist/typescript/app/exceptions.js.map +1 -0
- package/dist/typescript/app/governance.js +58 -0
- package/dist/typescript/app/governance.js.map +1 -0
- package/dist/typescript/app/logger.js +47 -0
- package/dist/typescript/app/logger.js.map +1 -0
- package/dist/typescript/app/rateLimiter.js +37 -0
- package/dist/typescript/app/rateLimiter.js.map +1 -0
- package/dist/typescript/app/sanitize.js +95 -0
- package/dist/typescript/app/sanitize.js.map +1 -0
- package/dist/typescript/app/tools/create.js +55 -0
- package/dist/typescript/app/tools/create.js.map +1 -0
- package/dist/typescript/app/tools/describe.js +190 -0
- package/dist/typescript/app/tools/describe.js.map +1 -0
- package/dist/typescript/app/tools/handleError.js +205 -0
- package/dist/typescript/app/tools/handleError.js.map +1 -0
- package/dist/typescript/app/tools/index.js +24 -0
- package/dist/typescript/app/tools/index.js.map +1 -0
- package/dist/typescript/app/tools/listBases.js +47 -0
- package/dist/typescript/app/tools/listBases.js.map +1 -0
- package/dist/typescript/app/tools/listExceptions.js +16 -0
- package/dist/typescript/app/tools/listExceptions.js.map +1 -0
- package/dist/typescript/app/tools/listGovernance.js +15 -0
- package/dist/typescript/app/tools/listGovernance.js.map +1 -0
- package/dist/typescript/app/tools/query.js +133 -0
- package/dist/typescript/app/tools/query.js.map +1 -0
- package/dist/typescript/app/tools/response.js +21 -0
- package/dist/typescript/app/tools/response.js.map +1 -0
- package/dist/typescript/app/tools/update.js +57 -0
- package/dist/typescript/app/tools/update.js.map +1 -0
- package/dist/typescript/app/tools/upsert.js +66 -0
- package/dist/typescript/app/tools/upsert.js.map +1 -0
- package/dist/typescript/app/tools/webhooks.js +45 -0
- package/dist/typescript/app/tools/webhooks.js.map +1 -0
- package/dist/typescript/app/types.js +291 -0
- package/dist/typescript/app/types.js.map +1 -0
- package/dist/typescript/app/validateApiKey.js +75 -0
- package/dist/typescript/app/validateApiKey.js.map +1 -0
- package/dist/typescript/errors.js +75 -0
- package/dist/typescript/errors.js.map +1 -0
- package/dist/typescript/index.js +27 -0
- package/dist/typescript/index.js.map +1 -0
- package/package.json +49 -31
- package/tsconfig.json +10 -4
- package/types/typescript/airtable-mcp-server.d.ts +2 -0
- package/types/typescript/app/airtable-client.d.ts +50 -0
- package/types/typescript/app/config.d.ts +17 -0
- package/types/typescript/app/context.d.ts +12 -0
- package/types/typescript/app/exceptions.d.ts +12 -0
- package/types/typescript/app/governance.d.ts +18 -0
- package/types/typescript/app/logger.d.ts +13 -0
- package/types/typescript/app/rateLimiter.d.ts +13 -0
- package/types/typescript/app/sanitize.d.ts +50 -0
- package/types/typescript/app/tools/create.d.ts +3 -0
- package/types/typescript/app/tools/describe.d.ts +3 -0
- package/types/typescript/app/tools/handleError.d.ts +8 -0
- package/types/typescript/app/tools/index.d.ts +3 -0
- package/types/typescript/app/tools/listBases.d.ts +13 -0
- package/types/typescript/app/tools/listExceptions.d.ts +3 -0
- package/types/typescript/app/tools/listGovernance.d.ts +3 -0
- package/types/typescript/app/tools/query.d.ts +3 -0
- package/types/typescript/app/tools/response.d.ts +20 -0
- package/types/typescript/app/tools/update.d.ts +3 -0
- package/types/typescript/app/tools/upsert.d.ts +3 -0
- package/types/typescript/app/tools/webhooks.d.ts +3 -0
- package/types/typescript/app/types.d.ts +318 -0
- package/types/typescript/app/validateApiKey.d.ts +25 -0
- package/types/typescript/errors.d.ts +57 -0
- package/types/typescript/index.d.ts +10 -0
- package/types/typescript/prompt-templates.d.ts +5 -0
- package/types/typescript/tools-schemas.d.ts +5 -0
- package/airtable_simple.js +0 -1561
- package/airtable_simple_production.js +0 -1564
- package/dist/airtable-mcp-server.js +0 -660
- package/dist/airtable-mcp-server.js.map +0 -1
- package/dist/test-suite.js +0 -421
- package/dist/test-suite.js.map +0 -1
- package/examples/airtable-crud-example.js +0 -203
- package/examples/building-mcp.md +0 -6666
- package/examples/claude_config.json +0 -4
- package/examples/claude_simple_config.json +0 -7
- package/examples/env-demo.js +0 -172
- package/examples/example-tasks-update.json +0 -23
- package/examples/example-tasks.json +0 -26
- package/examples/example_usage.md +0 -124
- package/examples/python_debug_patch.txt +0 -27
- package/examples/sample-transform.js +0 -76
- package/examples/typescript/advanced-ai-prompts.ts +0 -447
- package/examples/typescript/basic-usage.ts +0 -174
- package/examples/typescript/claude-desktop-config.json +0 -29
- package/examples/windsurf_mcp_config.json +0 -17
- package/types/ai-prompts.d.ts +0 -321
- package/types/airtable-mcp-server.d.ts +0 -52
- package/types/index.d.ts +0 -357
- package/types/tools.d.ts +0 -514
- /package/types/{test-suite.d.ts → typescript/test-suite.d.ts} +0 -0
package/package.json
CHANGED
|
@@ -1,33 +1,41 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rashidazarang/airtable-mcp",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.2.8",
|
|
4
4
|
"description": "Advanced AI-powered Airtable MCP server with TypeScript support, intelligent analytics, predictive modeling, and enterprise automation capabilities",
|
|
5
|
-
"main": "
|
|
5
|
+
"main": "dist/typescript/index.js",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": {
|
|
8
|
-
"import": "./dist/
|
|
9
|
-
"require": "./
|
|
10
|
-
"types": "./types/index.d.ts"
|
|
8
|
+
"import": "./dist/typescript/index.js",
|
|
9
|
+
"require": "./dist/typescript/index.js",
|
|
10
|
+
"types": "./types/typescript/index.d.ts"
|
|
11
11
|
},
|
|
12
|
-
"./types": "./types/
|
|
13
|
-
"./types/*": "./types
|
|
12
|
+
"./types": "./types/typescript/app/types.d.ts",
|
|
13
|
+
"./types/*": "./types/typescript/**/*.d.ts"
|
|
14
14
|
},
|
|
15
15
|
"bin": {
|
|
16
|
-
"airtable-mcp": "./
|
|
17
|
-
"airtable-mcp-
|
|
16
|
+
"airtable-mcp": "./bin/airtable-mcp.js",
|
|
17
|
+
"airtable-mcp-cli": "./bin/airtable-crud-cli.js"
|
|
18
18
|
},
|
|
19
19
|
"scripts": {
|
|
20
|
-
"start": "node airtable_simple_production.js",
|
|
21
|
-
"start:ts": "node dist/airtable-mcp-server.js",
|
|
22
|
-
"start:python": "python3.10 inspector_server.py",
|
|
23
|
-
"test": "node test_mcp_comprehensive.js",
|
|
24
|
-
"test:quick": "./quick_test.sh",
|
|
25
|
-
"test:types": "tsc --noEmit",
|
|
26
|
-
"test:ts": "npm run build && node dist/test-suite.js",
|
|
27
20
|
"build": "tsc",
|
|
28
21
|
"build:watch": "tsc --watch",
|
|
29
|
-
"
|
|
30
|
-
"
|
|
22
|
+
"clean": "rm -rf dist",
|
|
23
|
+
"prebuild": "npm run clean",
|
|
24
|
+
"start": "node dist/typescript/airtable-mcp-server.js",
|
|
25
|
+
"start:dev": "ts-node src/typescript/airtable-mcp-server.ts",
|
|
26
|
+
"start:js": "node src/javascript/airtable_simple_production.js",
|
|
27
|
+
"test": "jest",
|
|
28
|
+
"test:unit": "jest tests/unit",
|
|
29
|
+
"test:integration": "jest tests/integration",
|
|
30
|
+
"test:e2e": "jest tests/e2e",
|
|
31
|
+
"test:types": "tsc --noEmit",
|
|
32
|
+
"lint": "eslint src/**/*.{js,ts}",
|
|
33
|
+
"lint:fix": "eslint src/**/*.{js,ts} --fix",
|
|
34
|
+
"format": "prettier --write \"src/**/*.{js,ts,json,md}\"",
|
|
35
|
+
"format:check": "prettier --check \"src/**/*.{js,ts,json,md}\"",
|
|
36
|
+
"dev": "nodemon --watch src --exec ts-node src/typescript/airtable-mcp-server.ts",
|
|
37
|
+
"prepare": "npm run build",
|
|
38
|
+
"prepublishOnly": "npm run build"
|
|
31
39
|
},
|
|
32
40
|
"keywords": [
|
|
33
41
|
"airtable",
|
|
@@ -38,35 +46,45 @@
|
|
|
38
46
|
"ai",
|
|
39
47
|
"database",
|
|
40
48
|
"typescript",
|
|
41
|
-
"
|
|
49
|
+
"automation",
|
|
50
|
+
"enterprise",
|
|
51
|
+
"analytics"
|
|
42
52
|
],
|
|
43
53
|
"files": [
|
|
44
|
-
"airtable_simple.js",
|
|
45
|
-
"airtable_simple_production.js",
|
|
46
54
|
"dist/",
|
|
47
55
|
"types/",
|
|
56
|
+
"bin/",
|
|
48
57
|
"README.md",
|
|
49
58
|
"LICENSE",
|
|
50
59
|
"package.json",
|
|
51
|
-
"tsconfig.json"
|
|
52
|
-
"examples/",
|
|
53
|
-
"bin/"
|
|
60
|
+
"tsconfig.json"
|
|
54
61
|
],
|
|
55
|
-
"types": "types/index.d.ts",
|
|
62
|
+
"types": "types/typescript/index.d.ts",
|
|
56
63
|
"author": "Rashid Azarang",
|
|
57
64
|
"license": "MIT",
|
|
58
65
|
"dependencies": {
|
|
59
|
-
"@
|
|
60
|
-
"
|
|
61
|
-
"
|
|
66
|
+
"@modelcontextprotocol/sdk": "^1.24.0",
|
|
67
|
+
"dotenv": "^16.0.0",
|
|
68
|
+
"zod": "^4.2.1",
|
|
69
|
+
"zod-to-json-schema": "^3.25.0"
|
|
62
70
|
},
|
|
63
71
|
"devDependencies": {
|
|
64
|
-
"
|
|
72
|
+
"@types/dotenv": "^8.2.0",
|
|
73
|
+
"@types/jest": "^29.5.0",
|
|
65
74
|
"@types/node": "^20.10.0",
|
|
66
|
-
"@
|
|
75
|
+
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
|
76
|
+
"@typescript-eslint/parser": "^6.0.0",
|
|
77
|
+
"eslint": "^8.50.0",
|
|
78
|
+
"eslint-config-prettier": "^9.0.0",
|
|
79
|
+
"jest": "^29.7.0",
|
|
80
|
+
"nodemon": "^3.0.0",
|
|
81
|
+
"prettier": "^3.0.0",
|
|
82
|
+
"ts-jest": "^29.1.0",
|
|
83
|
+
"ts-node": "^10.9.0",
|
|
84
|
+
"typescript": "^5.3.0"
|
|
67
85
|
},
|
|
68
86
|
"engines": {
|
|
69
|
-
"node": ">=
|
|
87
|
+
"node": ">=18.0.0"
|
|
70
88
|
},
|
|
71
89
|
"repository": {
|
|
72
90
|
"type": "git",
|
package/tsconfig.json
CHANGED
|
@@ -23,16 +23,22 @@
|
|
|
23
23
|
"exactOptionalPropertyTypes": true,
|
|
24
24
|
"noImplicitOverride": true,
|
|
25
25
|
"noPropertyAccessFromIndexSignature": false,
|
|
26
|
-
"noUncheckedIndexedAccess": true
|
|
26
|
+
"noUncheckedIndexedAccess": true,
|
|
27
|
+
"types": []
|
|
27
28
|
},
|
|
28
29
|
"include": [
|
|
29
|
-
"src/**/*"
|
|
30
|
+
"src/typescript/**/*"
|
|
30
31
|
],
|
|
31
32
|
"exclude": [
|
|
32
33
|
"node_modules",
|
|
33
34
|
"dist",
|
|
34
35
|
"types",
|
|
35
36
|
"**/*.test.ts",
|
|
36
|
-
"**/*.spec.ts"
|
|
37
|
+
"**/*.spec.ts",
|
|
38
|
+
"src/javascript/**/*",
|
|
39
|
+
"src/python/**/*",
|
|
40
|
+
"src/typescript/prompt-templates.ts",
|
|
41
|
+
"src/typescript/tools-schemas.ts",
|
|
42
|
+
"src/typescript/**/*.d.ts"
|
|
37
43
|
]
|
|
38
|
-
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { RateLimiter } from './rateLimiter';
|
|
2
|
+
import { Logger } from './logger';
|
|
3
|
+
interface RequestOptions {
|
|
4
|
+
method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
5
|
+
/**
|
|
6
|
+
* Path including leading slash and version segment, e.g. `/v0/meta/bases/app123`.
|
|
7
|
+
*/
|
|
8
|
+
path: string;
|
|
9
|
+
query?: Record<string, string | number | boolean | Array<string | number | boolean> | undefined>;
|
|
10
|
+
body?: unknown;
|
|
11
|
+
baseId?: string;
|
|
12
|
+
idempotencyKey?: string;
|
|
13
|
+
}
|
|
14
|
+
interface ClientOptions {
|
|
15
|
+
baseLimiter: RateLimiter;
|
|
16
|
+
patLimiter: RateLimiter;
|
|
17
|
+
logger: Logger;
|
|
18
|
+
userAgent: string;
|
|
19
|
+
patHash: string;
|
|
20
|
+
maxRetries?: number;
|
|
21
|
+
}
|
|
22
|
+
export declare class AirtableClient {
|
|
23
|
+
private readonly baseLimiter;
|
|
24
|
+
private readonly patLimiter;
|
|
25
|
+
private readonly logger;
|
|
26
|
+
private readonly userAgent;
|
|
27
|
+
private readonly pat;
|
|
28
|
+
private readonly patHash;
|
|
29
|
+
private readonly maxRetries;
|
|
30
|
+
constructor(personalAccessToken: string, options: ClientOptions);
|
|
31
|
+
listBases(): Promise<{
|
|
32
|
+
bases: unknown[];
|
|
33
|
+
}>;
|
|
34
|
+
getBase(baseId: string): Promise<unknown>;
|
|
35
|
+
listTables(baseId: string): Promise<{
|
|
36
|
+
tables: unknown[];
|
|
37
|
+
}>;
|
|
38
|
+
queryRecords<T = unknown>(baseId: string, table: string, query?: RequestOptions['query']): Promise<T>;
|
|
39
|
+
createRecords<T = unknown>(baseId: string, table: string, payload: unknown, idempotencyKey?: string): Promise<T>;
|
|
40
|
+
updateRecords<T = unknown>(baseId: string, table: string, payload: unknown, idempotencyKey?: string): Promise<T>;
|
|
41
|
+
upsertRecords<T = unknown>(baseId: string, table: string, payload: unknown, idempotencyKey?: string): Promise<T>;
|
|
42
|
+
private request;
|
|
43
|
+
private withRetry;
|
|
44
|
+
private backoffWithJitter;
|
|
45
|
+
private performRequest;
|
|
46
|
+
private toDomainError;
|
|
47
|
+
private safeExtractErrorInfo;
|
|
48
|
+
private extractRequestId;
|
|
49
|
+
}
|
|
50
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { GovernanceSnapshot } from './types';
|
|
2
|
+
export type LogLevel = 'error' | 'warn' | 'info' | 'debug';
|
|
3
|
+
export interface AirtableAuthConfig {
|
|
4
|
+
personalAccessToken: string;
|
|
5
|
+
patHash: string;
|
|
6
|
+
defaultBaseId?: string;
|
|
7
|
+
allowedBases: string[];
|
|
8
|
+
tokenFormatWarnings: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface AppConfig {
|
|
11
|
+
version: string;
|
|
12
|
+
auth: AirtableAuthConfig;
|
|
13
|
+
governance: GovernanceSnapshot;
|
|
14
|
+
logLevel: LogLevel;
|
|
15
|
+
exceptionQueueSize: number;
|
|
16
|
+
}
|
|
17
|
+
export declare function loadConfig(): AppConfig;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AppConfig } from './config';
|
|
2
|
+
import { AirtableClient } from './airtable-client';
|
|
3
|
+
import { GovernanceService } from './governance';
|
|
4
|
+
import { ExceptionStore } from './exceptions';
|
|
5
|
+
import { Logger } from './logger';
|
|
6
|
+
export interface AppContext {
|
|
7
|
+
config: AppConfig;
|
|
8
|
+
logger: Logger;
|
|
9
|
+
airtable: AirtableClient;
|
|
10
|
+
governance: GovernanceService;
|
|
11
|
+
exceptions: ExceptionStore;
|
|
12
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Logger } from './logger';
|
|
2
|
+
import { ListExceptionsInput, ListExceptionsOutput } from './types';
|
|
3
|
+
import { AirtableBrainError } from '../errors';
|
|
4
|
+
export declare class ExceptionStore {
|
|
5
|
+
private readonly capacity;
|
|
6
|
+
private readonly items;
|
|
7
|
+
private readonly logger;
|
|
8
|
+
constructor(capacity: number, logger: Logger);
|
|
9
|
+
record(error: AirtableBrainError, summary: string, details?: string, proposedFix?: Record<string, unknown>): void;
|
|
10
|
+
list(params: ListExceptionsInput): ListExceptionsOutput;
|
|
11
|
+
private parseCursor;
|
|
12
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { GovernanceSnapshot } from './types';
|
|
2
|
+
type Operation = GovernanceSnapshot['allowedOperations'][number];
|
|
3
|
+
export declare class GovernanceService {
|
|
4
|
+
private readonly snapshot;
|
|
5
|
+
private readonly tablesByBase;
|
|
6
|
+
constructor(snapshot: GovernanceSnapshot);
|
|
7
|
+
ensureBaseAllowed(baseId: string): void;
|
|
8
|
+
ensureOperationAllowed(operation: Operation): void;
|
|
9
|
+
ensureTableAllowed(baseId: string, table: string): void;
|
|
10
|
+
listPiiPolicies(baseId: string, table: string): Array<{
|
|
11
|
+
field: string;
|
|
12
|
+
policy: string;
|
|
13
|
+
}>;
|
|
14
|
+
getSnapshot(): GovernanceSnapshot;
|
|
15
|
+
isTableAllowed(baseId: string, table: string): boolean;
|
|
16
|
+
private buildTableIndex;
|
|
17
|
+
}
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { LogLevel } from './config';
|
|
2
|
+
export type LogMetadata = Record<string, unknown>;
|
|
3
|
+
export declare class Logger {
|
|
4
|
+
private readonly level;
|
|
5
|
+
private readonly context;
|
|
6
|
+
constructor(level: LogLevel, context?: LogMetadata);
|
|
7
|
+
child(context: LogMetadata): Logger;
|
|
8
|
+
error(message: string, metadata?: LogMetadata): void;
|
|
9
|
+
warn(message: string, metadata?: LogMetadata): void;
|
|
10
|
+
info(message: string, metadata?: LogMetadata): void;
|
|
11
|
+
debug(message: string, metadata?: LogMetadata): void;
|
|
12
|
+
private log;
|
|
13
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight token-based rate limiter to enforce Airtable quotas.
|
|
3
|
+
* Maintains per-key queues to preserve ordering and fairness.
|
|
4
|
+
*/
|
|
5
|
+
export declare class RateLimiter {
|
|
6
|
+
private readonly minIntervalMs;
|
|
7
|
+
private readonly lockByKey;
|
|
8
|
+
private readonly nextAvailableByKey;
|
|
9
|
+
constructor({ maxRequestsPerSecond }: {
|
|
10
|
+
maxRequestsPerSecond: number;
|
|
11
|
+
});
|
|
12
|
+
schedule(key: string): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sanitization utilities for Airtable formula strings.
|
|
3
|
+
*
|
|
4
|
+
* Prevents formula injection attacks by escaping user-provided
|
|
5
|
+
* strings before they're interpolated into Airtable formulas.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Escapes a string for safe use within Airtable formula string literals.
|
|
9
|
+
*
|
|
10
|
+
* Airtable formulas use double quotes for strings. This function escapes:
|
|
11
|
+
* - Double quotes (") -> \"
|
|
12
|
+
* - Backslashes (\) -> \\
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // Safe interpolation in formula:
|
|
16
|
+
* const formula = `Name = "${escapeFormulaString(userInput)}"`;
|
|
17
|
+
*
|
|
18
|
+
* @param input - The user-provided string to escape
|
|
19
|
+
* @returns The escaped string safe for use in formulas
|
|
20
|
+
*/
|
|
21
|
+
export declare function escapeFormulaString(input: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Validates that a formula string doesn't contain obvious injection attempts.
|
|
24
|
+
*
|
|
25
|
+
* This is a heuristic check - not foolproof, but catches common patterns.
|
|
26
|
+
* Should be used in addition to escapeFormulaString, not as a replacement.
|
|
27
|
+
*
|
|
28
|
+
* @param formula - The complete formula string to validate
|
|
29
|
+
* @returns Object with isValid flag and optional warning message
|
|
30
|
+
*/
|
|
31
|
+
export declare function validateFormula(formula: string): {
|
|
32
|
+
isValid: boolean;
|
|
33
|
+
warning?: string;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Builds a safe FIND formula for searching text in a field.
|
|
37
|
+
*
|
|
38
|
+
* @param searchTerm - The user-provided search term
|
|
39
|
+
* @param fieldName - The field name to search in
|
|
40
|
+
* @returns A safe FIND formula string
|
|
41
|
+
*/
|
|
42
|
+
export declare function buildSafeFindFormula(searchTerm: string, fieldName: string): string;
|
|
43
|
+
/**
|
|
44
|
+
* Builds a safe equality comparison formula.
|
|
45
|
+
*
|
|
46
|
+
* @param fieldName - The field name to compare
|
|
47
|
+
* @param value - The user-provided value to compare against
|
|
48
|
+
* @returns A safe equality formula string
|
|
49
|
+
*/
|
|
50
|
+
export declare function buildSafeEqualityFormula(fieldName: string, value: string): string;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { AppContext } from '../context';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
declare const listBasesOutputSchema: z.ZodObject<{
|
|
5
|
+
bases: z.ZodArray<z.ZodObject<{
|
|
6
|
+
id: z.ZodString;
|
|
7
|
+
name: z.ZodString;
|
|
8
|
+
permissionLevel: z.ZodOptional<z.ZodString>;
|
|
9
|
+
}, z.core.$strip>>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
export type ListBasesOutput = z.infer<typeof listBasesOutputSchema>;
|
|
12
|
+
export declare function registerListBasesTool(server: McpServer, ctx: AppContext): void;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility for creating consistent MCP tool responses.
|
|
3
|
+
*
|
|
4
|
+
* The MCP protocol requires the `content` array to contain displayable data.
|
|
5
|
+
* While `structuredContent` is the newer typed output format, most clients
|
|
6
|
+
* read from `content` for backwards compatibility.
|
|
7
|
+
*/
|
|
8
|
+
export interface ToolResponse<T> {
|
|
9
|
+
[x: string]: unknown;
|
|
10
|
+
structuredContent: T;
|
|
11
|
+
content: Array<{
|
|
12
|
+
type: 'text';
|
|
13
|
+
text: string;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Creates a tool response with both structuredContent (for typed clients)
|
|
18
|
+
* and content array (for backwards compatibility with MCP clients).
|
|
19
|
+
*/
|
|
20
|
+
export declare function createToolResponse<T>(data: T): ToolResponse<T>;
|