package.json•15.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"
]
}
}
}