Skip to main content
Glama

Attio MCP Server

by kesslerio
package.json15.4 kB
{ "name": "attio-mcp", "version": "1.0.0", "description": "A Model Context Protocol server that connects Attio to LLMs", "main": "dist/smithery.js", "module": "src/smithery.ts", "type": "module", "access": "public", "bin": { "attio-mcp": "dist/cli.js", "attio-discover": "dist/cli/discover.js" }, "exports": { ".": { "import": "./src/smithery.ts", "require": "./dist/smithery.js" }, "./cli": "./dist/cli.js", "./lib": "./dist/index.js" }, "scripts": { "clean": "shx rm -rf dist test-dist", "build": "tsc && tsc-alias", "postbuild": "shx chmod +x dist/*.js", "prepare": "npm run build", "start:stdio": "node dist/cli.js", "start:http": "node dist/http.js", "dev": "npx @smithery/cli dev", "check": "wireit", "build:watch": "tsc --watch", "lint:check": "wireit", "lint:src": "npx eslint --cache --cache-location .eslintcache -f compact --max-warnings=1000 \"src/**/*.ts\"", "lint:test": "npx eslint --cache --cache-location .eslintcache -f compact --max-warnings=800 \"test/**/*.ts\"", "lint:guard": "node scripts/ci/lint-warning-guard.cjs", "lint:fix": "wireit", "format": "npx prettier --write --config .prettierrc src/**/*.ts test/**/*.ts *.ts", "check:format": "npx prettier --check --config .prettierrc src/**/*.ts test/**/*.ts *.ts", "test": "vitest", "test:watch": "vitest --watch", "test:offline": "SKIP_INTEGRATION_TESTS=true vitest --config configs/vitest/vitest.config.offline.ts", "test:offline:run": "SKIP_INTEGRATION_TESTS=true vitest --config configs/vitest/vitest.config.offline.ts --run", "test:coverage": "vitest --coverage --run", "test:coverage:offline": "SKIP_INTEGRATION_TESTS=true vitest --config configs/vitest/vitest.config.offline.ts --coverage --run", "test:coverage:watch": "vitest --coverage --watch", "test:watch:offline": "SKIP_INTEGRATION_TESTS=true vitest --config configs/vitest/vitest.config.offline.ts --watch", "test:watch:ui": "vitest --ui", "test:watch:changed": "vitest --watch --changed", "test:single": "vitest --run", "test:debug": "vitest --reporter=verbose --no-coverage", "test:debug:issue-781": "E2E_MODE=true vitest --config vitest.config.debug.ts --run --reporter=verbose --testTimeout=300000", "test:ci": "E2E_MODE=true vitest --run --reporter=verbose", "test:integration": "vitest --config configs/vitest/vitest.config.integration.ts --run", "test:integration:only": "vitest --config configs/vitest/vitest.config.integration.ts --run test/integration/", "test:integration:watch": "vitest --config configs/vitest/vitest.config.integration.ts --watch", "test:integration:real-api": "vitest --config configs/vitest/vitest.config.integration.ts --run test/integration/real-api-integration.test.ts", "test:unit": "vitest --run test/handlers/ test/objects/ test/utils/ test/validators/", "test:smoke": "vitest --config configs/vitest/vitest.config.smoke.ts --run --reporter=dot", "test:core": "vitest --run test/services/ test/handlers/ --reporter=dot", "test:extended": "SKIP_INTEGRATION_TESTS=true vitest --run test/api/ test/objects/ test/utils/ --reporter=dot", "typecheck": "tsc --noEmit", "typecheck:watch": "tsc --noEmit --watch", "test:performance": "vitest --run test/performance/regression.test.ts", "test:mcp": "vitest run test/e2e/mcp/", "test:mcp:p0": "vitest run test/e2e/mcp/core-operations/", "test:mcp:p1:lists": "vitest run test/e2e/mcp/list-management/", "test:mcp:p1:deals": "vitest run test/e2e/mcp/deal-operations/", "test:mcp:p1:notes": "vitest run test/e2e/mcp/note-operations/", "test:mcp:p1": "vitest run test/e2e/mcp/list-management/ test/e2e/mcp/deal-operations/ test/e2e/mcp/note-operations/", "test:mcp:watch": "vitest test/e2e/mcp/ --watch", "test:performance:all": "vitest --config configs/vitest/vitest.config.performance.ts --run", "test:performance:tools": "vitest --config configs/vitest/vitest.config.performance.ts --run test/handlers/tool-configs/universal/performance-*.test.ts", "test:playbooks": "vitest test/e2e/tools/universal/*-playbook-eval.e2e.test.ts --run --reporter=verbose", "test:playbooks:sales": "vitest test/e2e/tools/universal/sales-playbook-eval.e2e.test.ts --run --reporter=verbose", "test:playbooks:operations": "vitest test/e2e/tools/universal/operations-playbook-eval.e2e.test.ts --run --reporter=verbose", "perf:monitor": "node scripts/performance-monitor.cjs", "perf:report": "npm run test:performance -- --reporter=json > performance-results.json", "perf:budgets": "node scripts/check-performance-budgets.cjs", "check:offline": "tsc --project configs/tsconfig/tsconfig.offline.json --noEmit", "analyze:token-footprint": "tsx scripts/analyze-token-footprint.ts", "migrate-config": "node scripts/migrate-user-config.js", "codex:setup": "./scripts/codex-env-setup.sh", "codex:verify": "./scripts/verify-codex-env.sh", "setup": "chmod +x scripts/setup-dev-env.sh && ./scripts/setup-dev-env.sh", "setup:minimal": "chmod +x scripts/setup-dev-env.sh && ./scripts/setup-dev-env.sh --skip-tdd --skip-ide --skip-hooks", "postinstall": "[ -d .git ] && husky || echo 'Skipping git hooks setup (not a git repository)'", "test-hooks": "chmod +x build/test-hooks.sh && ./build/test-hooks.sh", "docker:build": "chmod +x scripts/docker-build.sh && ./scripts/docker-build.sh", "docker:run": "docker run -p 3000:3000 -e ATTIO_API_KEY=${ATTIO_API_KEY} -e ATTIO_WORKSPACE_ID=${ATTIO_WORKSPACE_ID} attio-mcp-server:latest", "docker:compose": "docker-compose up -d", "docker:logs": "docker-compose logs -f", "docker:stop": "docker-compose down", "discover": "node dist/cli/discover.js", "discover:attributes": "node dist/cli/discover.js attributes", "discover:all-attributes": "node dist/cli/discover.js attributes --all", "discover:high-memory": "NODE_OPTIONS='--max-old-space-size=4096' node dist/cli/discover.js", "discover:attributes:high-memory": "NODE_OPTIONS='--max-old-space-size=4096' node dist/cli/discover.js attributes", "discover:all-attributes:high-memory": "NODE_OPTIONS='--max-old-space-size=4096' node dist/cli/discover.js attributes --all", "discover:robust": "./scripts/run-discover.sh", "discover:attributes:robust": "./scripts/run-discover.sh attributes", "discover:all-attributes:robust": "./scripts/run-discover.sh attributes --all", "debug:list-members": "node --import tsx scripts/debug/list-workspace-members.ts", "debug:create-test-list": "node --import tsx scripts/debug/create-test-list.ts", "debug:cleanup-test-list": "node --import tsx scripts/debug/cleanup-test-list.ts", "syncpack:check": "syncpack list-mismatches", "syncpack:fix": "syncpack fix-mismatches", "check:all": "npm run check && npm run build && npm run test:offline", "e2e:gates": "node scripts/aggregate-ci-quality-gates.mjs --vitest-json vitest-report.json --suite core-workflows", "e2e:gates:enforce": "ENFORCE_GATES=true node scripts/aggregate-ci-quality-gates.mjs --vitest-json vitest-report.json --suite core-workflows", "setup:dev": "npm install && npm run build", "setup:tdd": "./scripts/setup-tdd.sh", "test:affected": "node scripts/test-affected.cjs", "ci:local": "./scripts/ci-local.sh", "fix:all": "./scripts/fix-all.sh", "report:generate": "node scripts/generate-report.cjs", "emergency:rollback": "./scripts/emergency-rollback.sh", "create:test": "./scripts/create-test.sh", "verify:env": "node -e \"console.log('Node:', process.version); console.log('NPM:', process.env.npm_version || 'unknown')\"", "setup:test-data": "tsx scripts/setup-test-data.ts", "e2e:setup": "tsx test/e2e/setup.ts", "test:e2e": "node --env-file=.env test/e2e/run-e2e-tests.js", "test:e2e:check": "node --env-file=.env test/e2e/run-e2e-tests.js --check", "test:e2e:limited": "node --env-file=.env test/e2e/run-e2e-tests.js --limited", "test:e2e:help": "node --env-file=.env test/e2e/run-e2e-tests.js --help", "test:e2e:tools": "node --env-file=.env ./node_modules/vitest/vitest.mjs run --config configs/vitest/vitest.config.e2e.ts test/e2e/tools/", "test:e2e:workflows": "node --env-file=.env ./node_modules/vitest/vitest.mjs run --config configs/vitest/vitest.config.e2e.ts test/e2e/suites/", "e2e": "node --env-file=.env ./node_modules/vitest/vitest.mjs run --config configs/vitest/vitest.config.e2e.ts", "e2e:watch": "node --env-file=.env ./node_modules/vitest/vitest.mjs --config configs/vitest/vitest.config.e2e.ts", "e2e:universal": "node --env-file=.env ./node_modules/vitest/vitest.mjs run --config configs/vitest/vitest.config.e2e.ts test/e2e/suites/universal-tools.e2e.test.ts", "e2e:lists": "node --env-file=.env ./node_modules/vitest/vitest.mjs run --config configs/vitest/vitest.config.e2e.ts test/e2e/suites/lists-management.e2e.test.ts", "e2e:notes": "node --env-file=.env ./node_modules/vitest/vitest.mjs run --config configs/vitest/vitest.config.e2e.ts test/e2e/suites/notes.e2e.test.ts", "e2e:tasks": "node --env-file=.env ./node_modules/vitest/vitest.mjs run --config configs/vitest/vitest.config.e2e.ts test/e2e/suites/tasks.e2e.test.ts", "e2e:errors": "node --env-file=.env ./node_modules/vitest/vitest.mjs run --config configs/vitest/vitest.config.e2e.ts test/e2e/suites/error-handling.e2e.test.ts", "e2e:cleanup": "tsx test/e2e/cleanup.ts", "e2e:cleanup:dry": "tsx test/e2e/cleanup.ts --dry-run", "e2e:cleanup:force": "tsx test/e2e/cleanup.ts --force", "cleanup:test-data": "tsx scripts/cleanup/index.ts", "cleanup:test-data:dry": "tsx scripts/cleanup/index.ts --dry-run", "cleanup:test-data:live": "tsx scripts/cleanup/index.ts --live", "cleanup:test-data:tasks": "npm run cleanup:test-data -- --resources=tasks", "cleanup:test-data:companies": "npm run cleanup:test-data -- --resources=companies", "cleanup:test-data:people": "npm run cleanup:test-data -- --resources=people", "cleanup:test-data:deals": "npm run cleanup:test-data -- --resources=deals", "cleanup:test-data:verbose": "tsx scripts/cleanup/index.ts --verbose", "cleanup:test-data:pattern": "tsx scripts/cleanup/index.ts --pattern=\"TEST_*,E2E_*\"", "e2e:debug": "DEBUG=* vitest --config configs/vitest/vitest.config.e2e.ts --reporter=verbose", "e2e:coverage": "vitest --config configs/vitest/vitest.config.e2e.ts --coverage --run", "e2e:validate": "tsx -e \"import('./test/e2e/utils/config-loader.js').then(m => m.loadE2EConfig()).then(() => console.log('✅ E2E configuration valid')).catch(e => { console.error('❌ E2E configuration invalid:', e); process.exit(1); })\"", "e2e:diagnose": "./scripts/e2e-diagnostics.sh", "e2e:diagnose:core": "./scripts/e2e-diagnostics.sh --suite core-workflows", "e2e:diagnose:errors": "./scripts/e2e-diagnostics.sh --suite error-handling", "e2e:diagnose:tools": "./scripts/e2e-diagnostics.sh --suite tools --json", "e2e:diagnose:json": "./scripts/e2e-diagnostics.sh --json", "e2e:analyze": "python3 ./scripts/e2e_analyze.py test-results --enhanced --stdout", "e2e:analyze:latest": "python3 ./scripts/e2e_analyze.py test-results --enhanced --stdout", "e2e:analyze:json": "python3 ./scripts/e2e_analyze.py test-results --enhanced --json --stdout", "e2e:analyze:trends": "python3 ./scripts/e2e_analyze.py test-results --enhanced --baseline-days=14 --flaky-days=14 --stdout", "e2e:analyze:basic": "python3 ./scripts/e2e_analyze.py test-results --stdout", "e2e:health": "./scripts/e2e-health-check.sh", "verify:staged": "lint-staged", "lint:ci": "npx eslint --cache --cache-location .eslintcache -f compact --max-warnings=50 \"src/**/*.ts\" \"test/**/*.ts\"" }, "files": [ "dist", "README.md", "LICENSE", "CHANGELOG.md" ], "keywords": [ "mcp", "model-context-protocol", "attio", "crm", "claude", "ai", "automation", "typescript", "llm", "sales", "marketing" ], "repository": { "type": "git", "url": "https://github.com/kesslerio/attio-mcp-server.git" }, "bugs": { "url": "https://github.com/kesslerio/attio-mcp-server/issues" }, "homepage": "https://github.com/kesslerio/attio-mcp-server#readme", "dependencies": { "@dqbd/tiktoken": "^1.0.15", "@modelcontextprotocol/sdk": "^1.4.1", "@smithery/sdk": "^1.6.6", "chalk": "^5.3.0", "cors": "^2.8.5", "dotenv": "^17.2.1", "express": "^5.1.0", "fast-safe-stringify": "^2.1.1", "handlebars": "^4.7.8", "libphonenumber-js": "^1.12.16", "ora": "^7.0.1", "safe-stable-stringify": "^2.5.0", "user": "^0.0.0", "yargs": "^18.0.0", "zod": "^3.23.8" }, "engines": { "node": ">=20.0.0", "npm": ">=10.0.0" }, "author": "@kesslerio", "license": "Apache-2.0", "devDependencies": { "@eslint/js": "^9.33.0", "@types/cors": "^2.8.19", "@types/express": "^5.0.3", "@types/glob": "^8.1.0", "@types/jest": "^30.0.0", "@types/string-similarity": "^4.0.2", "@types/yargs": "^17.0.33", "@typescript-eslint/eslint-plugin": "^8.39.0", "@typescript-eslint/parser": "^8.42.0", "@vitest/coverage-v8": "^3.2.4", "@vitest/ui": "^3.2.4", "axios": "^1.12.0", "dotenv-cli": "^10.0.0", "eslint": "^9.33.0", "eslint-formatter-compact": "^8.40.0", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import": "^2.32.0", "glob": "^11.0.3", "husky": "^9.1.7", "lint-staged": "^16.1.6", "mcp-test-client": "^1.0.1", "prettier": "^3.6.2", "shx": "^0.4.0", "syncpack": "^13.0.4", "tsc-alias": "^1.8.16", "tsx": "^4.19.2", "typescript": "^5.8.3", "vitest": "^3.2.4", "wireit": "^0.14.12" }, "lint-staged": { "*.{ts,tsx,js,jsx,mjs,cjs}": [ "prettier --write", "eslint --max-warnings=50 --fix" ], "*.{md,mdx,json,yml,yaml}": [ "prettier --write" ] }, "wireit": { "lint:check": { "command": "npx eslint --cache --cache-location .eslintcache -f compact --max-warnings 800 \"src/**/*.ts\" \"test/**/*.ts\"", "files": [ "src/**/*.ts", "test/**/*.ts", "*.ts", "eslint.config.js", "tsconfig.json", ".prettierrc" ], "output": [] }, "lint:src": { "command": "npx eslint --cache --cache-location .eslintcache -f compact --max-warnings 1000 \"src/**/*.ts\"", "files": [ "src/**/*.ts", "eslint.config.js", "tsconfig.json", ".prettierrc" ], "output": [] }, "lint:test": { "command": "npx eslint --cache --cache-location .eslintcache -f compact --max-warnings 800 \"test/**/*.ts\"", "files": [ "test/**/*.ts", "eslint.config.js", "tsconfig.json", ".prettierrc" ], "output": [] }, "lint:fix": { "command": "npx eslint --fix", "files": [ "src/**/*.ts", "test/**/*.ts", "*.ts", "eslint.config.js", "tsconfig.json", ".prettierrc" ], "output": [] }, "check": { "dependencies": [ "syncpack:check", "check:format", "lint:check", "typecheck" ] } } }

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/kesslerio/attio-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server