{"_id":"@fouradata/mcp","_rev":"54-2cd19fdc514784e54dd164fa8333fb42","name":"@fouradata/mcp","dist-tags":{"latest":"0.7.3"},"versions":{"0.2.11":{"name":"@fouradata/mcp","version":"0.2.11","keywords":["mcp","model-context-protocol","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"license":"MIT","_id":"@fouradata/mcp@0.2.11","maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"bin":{"mcp":"bin/foura-mcp.js","foura-mcp":"bin/foura-mcp.js"},"dist":{"shasum":"63168137d0b8b3afdaf516337559226a889cfc06","tarball":"https://registry.npmjs.org/@fouradata/mcp/-/mcp-0.2.11.tgz","fileCount":34,"integrity":"sha512-Lj7boNdAkVNhJAAquzFx3CGw+bS1PtQmHKfnRB5K8XhtyJn+6roXTJuxUcfmimJynL5QL98nsmVCt7rkX+JA6A==","signatures":[{"sig":"MEQCIHCQvCUgygJXW+abDsYOI6C6ZPqTYEEZmGqTRIXXZaUMAiAQD0l6ic12Q9yCw7MELcToW5qhfBw34sQ89bYeXN8rxA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171476},"main":"dist/server.js","type":"module","types":"./dist/server.d.ts","engines":{"node":">=20.0.0"},"gitHead":"12d7af89d31e7feb664d0ba2a8099bd0224d028f","scripts":{"dev":"tsx src/stdio.ts","bump":"node scripts/bump.mjs","lint":"tsc --noEmit","test":"npm run build && npm run test:unit && npm run test:integration:stdio && npm run test:docs && npm run test:schema-parity","build":"tsc","smoke":"node tests/smoke.mjs","test:ai":"node --test --test-reporter=spec 'tests/ai-compliance/**/*.test.mjs'","dev:http":"tsx src/http.ts","test:all":"npm run test && npm run test:integration:http && npm run test:ai","inspector":"npx -y @modelcontextprotocol/inspector tsx src/stdio.ts","test:docs":"node --test --test-reporter=spec 'tests/docs-compliance/**/*.test.mjs'","test:unit":"node --test --test-reporter=spec 'tests/unit/**/*.test.mjs'","start:http":"node dist/http.js","audit:tokens":"node scripts/audit-tokens.mjs","prepublishOnly":"npm run lint && npm run build","test:schema-parity":"node --test --test-reporter=spec 'tests/schema-parity/**/*.test.mjs'","test:integration:http":"node --test --test-reporter=spec 'tests/integration-http/**/*.test.mjs'","test:integration:stdio":"node --test --test-concurrency=1 --test-reporter=spec 'tests/integration-stdio/**/*.test.mjs'"},"_npmUser":{"name":"kopoev","email":"kopoev@gmail.com"},"_npmVersion":"11.13.0","description":"MCP server for the FourA web scraping API — three tools for HTTP requests, rotating proxies, and full browser sessions, usable from any MCP client.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.4.3","undici":"^8.2.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","typescript":"^6.0.3","@types/node":"^25.7.0","@types/express":"^5.0.6","@anthropic-ai/sdk":"^0.96.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.2.11_1778832922901_0.5236798436428345","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@fouradata/mcp","version":"0.3.0","keywords":["mcp","model-context-protocol","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"license":"MIT","_id":"@fouradata/mcp@0.3.0","maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"bin":{"mcp":"bin/foura-mcp.js","foura-mcp":"bin/foura-mcp.js"},"dist":{"shasum":"9517cf13b290963c4d318e1425e311a55858cd0a","tarball":"https://registry.npmjs.org/@fouradata/mcp/-/mcp-0.3.0.tgz","fileCount":37,"integrity":"sha512-0Etm/DWBXfRC1ahT4qbCr39jzk4gL0FcQG2wlLzKlVL/5uHZpsInCiBzNjTjTPYHic1drJ1sYVuV6TMlRC7vug==","signatures":[{"sig":"MEQCIEkRFoQlJ5KHpXWPKnWigEMp8rTMGRZc9YngDg8wo9D8AiAcUd07VXVK5m1nlaOvsvrCDrv7s+aND9kTR6RKrHh2LA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":217607},"main":"dist/server.js","type":"module","types":"./dist/server.d.ts","engines":{"node":">=20.0.0"},"gitHead":"15f570da1efce27ae4caa31844c99f4016a9368e","scripts":{"dev":"tsx src/stdio.ts","bump":"node scripts/bump.mjs","lint":"tsc --noEmit","test":"npm run build && npm run test:unit && npm run test:integration:stdio && npm run test:docs && npm run test:schema-parity","build":"tsc","smoke":"node tests/smoke.mjs","test:ai":"node --test --test-reporter=spec 'tests/ai-compliance/**/*.test.mjs'","dev:http":"tsx src/http.ts","test:all":"npm run test && npm run test:integration:http && npm run test:ai","inspector":"npx -y @modelcontextprotocol/inspector tsx src/stdio.ts","test:docs":"node --test --test-reporter=spec 'tests/docs-compliance/**/*.test.mjs'","test:unit":"node --test --test-reporter=spec 'tests/unit/**/*.test.mjs'","start:http":"node dist/http.js","audit:tokens":"node scripts/audit-tokens.mjs","prepublishOnly":"npm run lint && npm run build","test:schema-parity":"node --test --test-reporter=spec 'tests/schema-parity/**/*.test.mjs'","test:integration:http":"node --test --test-reporter=spec 'tests/integration-http/**/*.test.mjs'","test:integration:stdio":"node --test --test-concurrency=1 --test-reporter=spec 'tests/integration-stdio/**/*.test.mjs'"},"_npmUser":{"name":"kopoev","email":"kopoev@gmail.com"},"_npmVersion":"11.13.0","description":"MCP server for the FourA web scraping API — three tools for HTTP requests, rotating proxies, and full browser sessions, usable from any MCP client.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.4.3","undici":"^8.2.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","typescript":"^6.0.3","@types/node":"^25.7.0","@types/express":"^5.0.6","@anthropic-ai/sdk":"^0.96.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.3.0_1782842971489_0.3091276116766595","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@fouradata/mcp","version":"0.3.1","keywords":["mcp","model-context-protocol","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"license":"MIT","_id":"@fouradata/mcp@0.3.1","maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"bin":{"mcp":"bin/foura-mcp.js","foura-mcp":"bin/foura-mcp.js"},"dist":{"shasum":"78797d8ad7ed743aa9f2a5ac6e8f61eb77d05dd4","tarball":"https://registry.npmjs.org/@fouradata/mcp/-/mcp-0.3.1.tgz","fileCount":37,"integrity":"sha512-yMJu0KEfwDM6EFq2CJl58/ed6P1plSqj3B7dMwn03CGb1JW8Pbt++Z6oZwSZi0eSMcou3zIbR7hvdJe7c9xUbQ==","signatures":[{"sig":"MEQCIG4IdR2/zkHdrVPCjoiBtrrJ33MTHj4rET+ZQwUHFguWAiBaUjfXmuTRocbXjA2FWwpwjKQI4PaOw1SFqv2UtqfXNg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":217293},"main":"dist/server.js","type":"module","types":"./dist/server.d.ts","engines":{"node":">=20.0.0"},"gitHead":"4f65ed0faf2e77e590d56f76082d877e5578c316","scripts":{"dev":"tsx src/stdio.ts","bump":"node scripts/bump.mjs","lint":"tsc --noEmit","test":"npm run build && npm run test:unit && npm run test:integration:stdio && npm run test:docs && npm run test:schema-parity","build":"tsc","smoke":"node tests/smoke.mjs","test:ai":"node --test --test-reporter=spec 'tests/ai-compliance/**/*.test.mjs'","dev:http":"tsx src/http.ts","test:all":"npm run test && npm run test:integration:http && npm run test:ai","inspector":"npx -y @modelcontextprotocol/inspector tsx src/stdio.ts","test:docs":"node --test --test-reporter=spec 'tests/docs-compliance/**/*.test.mjs'","test:unit":"node --test --test-reporter=spec 'tests/unit/**/*.test.mjs'","start:http":"node dist/http.js","audit:tokens":"node scripts/audit-tokens.mjs","prepublishOnly":"npm run lint && npm run build","test:schema-parity":"node --test --test-reporter=spec 'tests/schema-parity/**/*.test.mjs'","test:integration:http":"node --test --test-reporter=spec 'tests/integration-http/**/*.test.mjs'","test:integration:stdio":"node --test --test-concurrency=1 --test-reporter=spec 'tests/integration-stdio/**/*.test.mjs'"},"_npmUser":{"name":"kopoev","email":"kopoev@gmail.com"},"_npmVersion":"11.13.0","description":"MCP server for the FourA web scraping API — three tools for HTTP requests, rotating proxies, and full browser sessions, usable from any MCP client.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.4.3","undici":"^8.2.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","typescript":"^6.0.3","@types/node":"^25.7.0","@types/express":"^5.0.6","@anthropic-ai/sdk":"^0.96.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.3.1_1782881747416_0.4550900067351069","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@fouradata/mcp","version":"0.3.2","keywords":["mcp","model-context-protocol","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"license":"MIT","_id":"@fouradata/mcp@0.3.2","maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"homepage":"https://foura.ai/docs/mcp/server","bugs":{"url":"https://github.com/fouradata/mcp/issues"},"bin":{"mcp":"bin/foura-mcp.js","foura-mcp":"bin/foura-mcp.js"},"dist":{"shasum":"93f1997ae97a20a1a8a116d87d75671f0fd058f0","tarball":"https://registry.npmjs.org/@fouradata/mcp/-/mcp-0.3.2.tgz","fileCount":37,"integrity":"sha512-BqUzW6dvu1a0NKOt34Kkh4C3xLPsj6VaUlGpFTeNj7z2CGx1SAy8q2Kod53K51EzugsqsNxE24n5vw8tkRUw5A==","signatures":[{"sig":"MEUCIGk04gdKrdg03MqngxGmbdgT+KmLJlrQ4R8Nn7jFnWDxAiEA9Pb7weoOS7+DupXN/J2uFF0gNqzCc/xauirnudWLFA4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@fouradata%2fmcp@0.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":216967},"main":"dist/server.js","type":"module","types":"./dist/server.d.ts","engines":{"node":">=20.0.0"},"gitHead":"8d3a5267ab95fa111735de77ace59c0974345d18","scripts":{"dev":"tsx src/stdio.ts","bump":"node scripts/bump.mjs","lint":"tsc --noEmit","test":"npm run build && npm run test:unit && npm run test:integration:stdio && npm run test:docs","build":"tsc","smoke":"node tests/smoke.mjs","test:ai":"node --test --test-reporter=spec 'tests/ai-compliance/**/*.test.mjs'","dev:http":"tsx src/http.ts","test:all":"npm run test && npm run test:integration:http && npm run test:ai","inspector":"npx -y @modelcontextprotocol/inspector tsx src/stdio.ts","test:docs":"node --test --test-reporter=spec 'tests/docs-compliance/**/*.test.mjs'","test:unit":"node --test --test-reporter=spec 'tests/unit/**/*.test.mjs'","start:http":"node dist/http.js","audit:tokens":"node scripts/audit-tokens.mjs","prepublishOnly":"npm run lint && npm run build","test:integration:http":"node --test --test-reporter=spec 'tests/integration-http/**/*.test.mjs'","test:integration:stdio":"node --test --test-concurrency=1 --test-reporter=spec 'tests/integration-stdio/**/*.test.mjs'"},"_npmUser":{"name":"kopoev","email":"kopoev@gmail.com"},"repository":{"url":"git+https://github.com/fouradata/mcp.git","type":"git"},"_npmVersion":"11.13.0","description":"MCP server for the FourA web scraping API — three tools for HTTP requests, rotating proxies, and full browser sessions, usable from any MCP client.","directories":{},"_nodeVersion":"24.17.0","dependencies":{"zod":"^4.4.3","undici":"^8.2.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","typescript":"^6.0.3","@types/node":"^25.7.0","@types/express":"^5.0.6","@anthropic-ai/sdk":"^0.96.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.3.2_1782885195588_0.8992455231708618","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@fouradata/mcp","version":"0.3.3","keywords":["mcp","model-context-protocol","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"license":"MIT","_id":"@fouradata/mcp@0.3.3","maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"homepage":"https://foura.ai/docs/mcp/server","bugs":{"url":"https://github.com/fouradata/mcp/issues"},"bin":{"mcp":"bin/foura-mcp.js","foura-mcp":"bin/foura-mcp.js"},"dist":{"shasum":"e7c279d9cc1c6d7750a5e85d8669699a23adfcee","tarball":"https://registry.npmjs.org/@fouradata/mcp/-/mcp-0.3.3.tgz","fileCount":37,"integrity":"sha512-6/fbXt++yZchq5LuvtRdTWWKFwkA6Xn0Unyc0tWnPoy8a21sv7zmru0+m9PMBZ1X1ZdIra1v8H16xuv/4SkzOA==","signatures":[{"sig":"MEUCIQDCpc87Yy50R4UF8G0WXI2FPap5DvTvSCZgQFDYOAlavAIgcPQlEhJO/kbj324WgFDo10aFQjF+maj2a8TeVhFUfvQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@fouradata%2fmcp@0.3.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":217224},"main":"dist/server.js","type":"module","types":"./dist/server.d.ts","engines":{"node":">=20.0.0"},"gitHead":"34d52c8ec199457033b0d393c3ed5fb6eae48e4f","scripts":{"dev":"tsx src/stdio.ts","bump":"node scripts/bump.mjs","lint":"tsc --noEmit","test":"npm run build && npm run test:unit && npm run test:integration:stdio && npm run test:docs","build":"tsc","smoke":"node tests/smoke.mjs","test:ai":"node --test --test-reporter=spec 'tests/ai-compliance/**/*.test.mjs'","dev:http":"tsx src/http.ts","test:all":"npm run test && npm run test:integration:http && npm run test:ai","inspector":"npx -y @modelcontextprotocol/inspector tsx src/stdio.ts","test:docs":"node --test --test-reporter=spec 'tests/docs-compliance/**/*.test.mjs'","test:unit":"node --test --test-reporter=spec 'tests/unit/**/*.test.mjs'","start:http":"node dist/http.js","audit:tokens":"node scripts/audit-tokens.mjs","prepublishOnly":"npm run lint && npm run build","test:integration:http":"node --test --test-reporter=spec 'tests/integration-http/**/*.test.mjs'","test:integration:stdio":"node --test --test-concurrency=1 --test-reporter=spec 'tests/integration-stdio/**/*.test.mjs'"},"_npmUser":{"name":"kopoev","email":"kopoev@gmail.com"},"repository":{"url":"git+https://github.com/fouradata/mcp.git","type":"git"},"_npmVersion":"11.16.0","description":"MCP server for the FourA web scraping API — three tools for HTTP requests, rotating proxies, and full browser sessions, usable from any MCP client.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","undici":"^8.2.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","typescript":"^6.0.3","@types/node":"^25.7.0","@types/express":"^5.0.6","@anthropic-ai/sdk":"^0.96.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.3.3_1782886440793_0.9859647822156186","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@fouradata/mcp","version":"0.4.0","keywords":["mcp","mcp-server","model-context-protocol","claude","cursor","ai-agents","llm-tools","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"license":"MIT","_id":"@fouradata/mcp@0.4.0","maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"homepage":"https://foura.ai/mcp","bugs":{"url":"https://github.com/fouradata/mcp/issues"},"bin":{"mcp":"bin/foura-mcp.js","foura-mcp":"bin/foura-mcp.js"},"dist":{"shasum":"82bc07cb0a95fac50f72e354c89c3279ab3852a7","tarball":"https://registry.npmjs.org/@fouradata/mcp/-/mcp-0.4.0.tgz","fileCount":40,"integrity":"sha512-FOPF/36MUajYLq+1e7LUEn4P2R6Cn/3SPDNbzp8Hvx7JpB4KyD1dKMc66herNXjB6Vv+E5gTarTRa0anGoex7w==","signatures":[{"sig":"MEUCIQCkijfhbi7pRbFguTBaV6ret/6WzMNJjUHw7WgN+OATyQIgE8g5dL8uYPTntCHgfZG4+m6ArdYQmPRbat0aca3vopw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@fouradata%2fmcp@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":224165},"main":"dist/server.js","type":"module","types":"./dist/server.d.ts","engines":{"node":">=20.0.0"},"gitHead":"b3bbbebd78bc7ca913dec664385d84229eeebc59","scripts":{"dev":"tsx src/stdio.ts","bump":"node scripts/bump.mjs","lint":"tsc --noEmit","test":"npm run build && npm run test:unit && npm run test:integration:stdio && npm run test:docs","build":"tsc","smoke":"node tests/smoke.mjs","test:ai":"node --test --test-reporter=spec 'tests/ai-compliance/**/*.test.mjs'","dev:http":"tsx src/http.ts","test:all":"npm run test && npm run test:integration:http && npm run test:ai","inspector":"npx -y @modelcontextprotocol/inspector tsx src/stdio.ts","test:docs":"node --test --test-reporter=spec 'tests/docs-compliance/**/*.test.mjs'","test:unit":"node --test --test-reporter=spec 'tests/unit/**/*.test.mjs'","start:http":"node dist/http.js","audit:tokens":"node scripts/audit-tokens.mjs","prepublishOnly":"npm run lint && npm run build","test:integration:http":"node --test --test-reporter=spec 'tests/integration-http/**/*.test.mjs'","test:integration:stdio":"node --test --test-concurrency=1 --test-reporter=spec 'tests/integration-stdio/**/*.test.mjs'"},"_npmUser":{"name":"kopoev","email":"kopoev@gmail.com"},"repository":{"url":"git+https://github.com/fouradata/mcp.git","type":"git"},"_npmVersion":"11.13.0","description":"MCP server for the FourA web scraping API - four tools (smart auto-fetch, HTTP request, rotating proxies, full browser) plus six prompts, usable from any MCP client.","directories":{},"_nodeVersion":"24.17.0","dependencies":{"zod":"^4.4.3","undici":"^8.2.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","typescript":"^6.0.3","@types/node":"^25.7.0","@types/express":"^5.0.6","@anthropic-ai/sdk":"^0.96.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.4.0_1782901703605_0.7779312553767497","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@fouradata/mcp","version":"0.4.1","keywords":["mcp","mcp-server","model-context-protocol","claude","cursor","ai-agents","llm-tools","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"license":"MIT","_id":"@fouradata/mcp@0.4.1","maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"homepage":"https://foura.ai/mcp","bugs":{"url":"https://github.com/fouradata/mcp/issues"},"bin":{"mcp":"bin/foura-mcp.js","foura-mcp":"bin/foura-mcp.js"},"dist":{"shasum":"4ee5417f3fa2130860715e36cb0fc6188e815bdc","tarball":"https://registry.npmjs.org/@fouradata/mcp/-/mcp-0.4.1.tgz","fileCount":40,"integrity":"sha512-FhAtq9CeiK3UNbbUDv8h0rTu9y1VmXLpcu+iXm/ibxSDClKGsLhDZq/MG6CvIribMM8xpwLl6iPcKwtBZky7oA==","signatures":[{"sig":"MEQCIFQv97tNxF4E6HABBuexEqtCMkSmDfCxwNq1Q9ceLE72AiBJHqfIIfpo+2WkLMCOnV7hT4sot5l/lvnSEboIQvHhvw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@fouradata%2fmcp@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":224053},"main":"dist/server.js","type":"module","types":"./dist/server.d.ts","engines":{"node":">=20.0.0"},"gitHead":"ed2839f814bde317c0728d54641e1402002d4e6e","mcpName":"ai.foura/mcp","scripts":{"dev":"tsx src/stdio.ts","bump":"node scripts/bump.mjs","lint":"tsc --noEmit","test":"npm run build && npm run test:unit && npm run test:integration:stdio && npm run test:docs","build":"tsc","smoke":"node tests/smoke.mjs","dev:http":"tsx src/http.ts","test:all":"npm run test && npm run test:integration:http","inspector":"npx -y @modelcontextprotocol/inspector tsx src/stdio.ts","test:docs":"node --test --test-reporter=spec 'tests/docs-compliance/**/*.test.mjs'","test:unit":"node --test --test-reporter=spec 'tests/unit/**/*.test.mjs'","start:http":"node dist/http.js","audit:tokens":"node scripts/audit-tokens.mjs","prepublishOnly":"npm run lint && npm run build","test:integration:http":"node --test --test-reporter=spec 'tests/integration-http/**/*.test.mjs'","test:integration:stdio":"node --test --test-concurrency=1 --test-reporter=spec 'tests/integration-stdio/**/*.test.mjs'"},"_npmUser":{"name":"kopoev","email":"kopoev@gmail.com"},"repository":{"url":"git+https://github.com/fouradata/mcp.git","type":"git"},"_npmVersion":"11.16.0","description":"MCP server for the FourA web scraping API - four tools (smart auto-fetch, HTTP request, rotating proxies, full browser) plus six prompts, usable from any MCP client.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","undici":"^8.2.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","typescript":"^6.0.3","@types/node":"^24.13.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.4.1_1782905336696_0.6510490982873869","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@fouradata/mcp","version":"0.4.2","keywords":["mcp","mcp-server","model-context-protocol","claude","cursor","ai-agents","llm-tools","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"license":"MIT","_id":"@fouradata/mcp@0.4.2","maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"homepage":"https://foura.ai/mcp","bugs":{"url":"https://github.com/fouradata/mcp/issues"},"bin":{"mcp":"bin/foura-mcp.js","foura-mcp":"bin/foura-mcp.js"},"dist":{"shasum":"6972675725a211ac0d3f9b7d410ffd07b222024a","tarball":"https://registry.npmjs.org/@fouradata/mcp/-/mcp-0.4.2.tgz","fileCount":40,"integrity":"sha512-+yZ2PkJrbdGVKZbpCiMhaONQWyN7yfYHzO6F0UPF7zmeQMZGyGBS3EkejLQ4LBkZEmqmMj+mD6oJT1f6MLDIiA==","signatures":[{"sig":"MEQCICYPPxEky3ip9zeu4Lde9B/vzpcVDiPMIgE/xuCuHSPpAiBn88at5cJTYBnXbBAgx/9Iqi35YNlF0MAuO18SZbaNPg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@fouradata%2fmcp@0.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":224337},"main":"dist/server.js","type":"module","types":"./dist/server.d.ts","engines":{"node":">=20.0.0"},"gitHead":"9e75e6c2fd7af6beb21369c748c63c5bfb85f29d","mcpName":"ai.foura/mcp","scripts":{"dev":"tsx src/stdio.ts","bump":"node scripts/bump.mjs","lint":"tsc --noEmit","test":"npm run build && npm run test:unit && npm run test:integration:stdio && npm run test:docs","build":"tsc","smoke":"node tests/smoke.mjs","dev:http":"tsx src/http.ts","test:all":"npm run test && npm run test:integration:http","inspector":"npx -y @modelcontextprotocol/inspector tsx src/stdio.ts","test:docs":"node --test --test-reporter=spec 'tests/docs-compliance/**/*.test.mjs'","test:unit":"node --test --test-reporter=spec 'tests/unit/**/*.test.mjs'","start:http":"node dist/http.js","audit:tokens":"node scripts/audit-tokens.mjs","prepublishOnly":"npm run lint && npm run build","test:integration:http":"node --test --test-reporter=spec 'tests/integration-http/**/*.test.mjs'","test:integration:stdio":"node --test --test-concurrency=1 --test-reporter=spec 'tests/integration-stdio/**/*.test.mjs'"},"_npmUser":{"name":"kopoev","email":"kopoev@gmail.com"},"repository":{"url":"git+https://github.com/fouradata/mcp.git","type":"git"},"_npmVersion":"11.16.0","description":"MCP server for the FourA web scraping API - four tools (smart auto-fetch, HTTP request, rotating proxies, full browser) plus six prompts, usable from any MCP client.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","undici":"^8.2.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","typescript":"^6.0.3","@types/node":"^24.13.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.4.2_1782920311000_0.8670912860397557","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@fouradata/mcp","version":"0.4.3","keywords":["mcp","mcp-server","model-context-protocol","claude","cursor","ai-agents","llm-tools","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"license":"MIT","_id":"@fouradata/mcp@0.4.3","maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"homepage":"https://foura.ai/mcp","bugs":{"url":"https://github.com/fouradata/mcp/issues"},"bin":{"mcp":"bin/foura-mcp.js","foura-mcp":"bin/foura-mcp.js"},"dist":{"shasum":"8ed6ab29074ddc614c59991b2019a4098e4155b8","tarball":"https://registry.npmjs.org/@fouradata/mcp/-/mcp-0.4.3.tgz","fileCount":40,"integrity":"sha512-p9EMgXYQ02AXUkOLMiHNFQGJJElSe3Y1yCBPw4WiijukW2zprbEFXf7MoZ6H8A0DMeb9vQI5gRLSClwVqOSSTA==","signatures":[{"sig":"MEUCIQDSz3uibPJ5FYumIqu+uoKR2GJZLnlugrOU4P4C+TdaTgIgWscoYsOmP3DWtjOBkMM3GH/K/YSMNOaMxKNfH5M8BuU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@fouradata%2fmcp@0.4.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":224436},"main":"dist/server.js","type":"module","types":"./dist/server.d.ts","engines":{"node":">=20.0.0"},"gitHead":"114b9365328c16b7324e441c52be634392aff9d6","mcpName":"ai.foura/mcp","scripts":{"dev":"tsx src/stdio.ts","bump":"node scripts/bump.mjs","lint":"tsc --noEmit","test":"npm run build && npm run test:unit && npm run test:integration:stdio && npm run test:docs","build":"tsc","smoke":"node tests/smoke.mjs","dev:http":"tsx src/http.ts","test:all":"npm run test && npm run test:integration:http","inspector":"npx -y @modelcontextprotocol/inspector tsx src/stdio.ts","test:docs":"node --test --test-reporter=spec 'tests/docs-compliance/**/*.test.mjs'","test:unit":"node --test --test-reporter=spec 'tests/unit/**/*.test.mjs'","start:http":"node dist/http.js","audit:tokens":"node scripts/audit-tokens.mjs","prepublishOnly":"npm run lint && npm run build","test:integration:http":"node --test --test-reporter=spec 'tests/integration-http/**/*.test.mjs'","test:integration:stdio":"node --test --test-concurrency=1 --test-reporter=spec 'tests/integration-stdio/**/*.test.mjs'"},"_npmUser":{"name":"kopoev","email":"kopoev@gmail.com"},"repository":{"url":"git+https://github.com/fouradata/mcp.git","type":"git"},"_npmVersion":"11.16.0","description":"MCP server for the FourA web scraping API - four tools (smart auto-fetch, HTTP request, rotating proxies, full browser) plus six prompts, usable from any MCP client.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","undici":"^8.2.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","typescript":"^6.0.3","@types/node":"^24.13.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.4.3_1782920785315_0.6537113709600064","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"@fouradata/mcp","version":"0.4.4","keywords":["mcp","mcp-server","model-context-protocol","claude","cursor","ai-agents","llm-tools","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"license":"MIT","_id":"@fouradata/mcp@0.4.4","maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"homepage":"https://foura.ai/mcp","bugs":{"url":"https://github.com/fouradata/mcp/issues"},"bin":{"mcp":"bin/foura-mcp.js","foura-mcp":"bin/foura-mcp.js"},"dist":{"shasum":"4fe86c71a658686b5d4136cc5dd97f74b568c7d4","tarball":"https://registry.npmjs.org/@fouradata/mcp/-/mcp-0.4.4.tgz","fileCount":40,"integrity":"sha512-44Bnq1Cu73dpp4zXfwx5xq4aNRjuZ3W7IWbhhcViWiBK0tzEGiZW2a6UOstm4NxgNladbKq0URK11OBfs5TPLw==","signatures":[{"sig":"MEQCIFYJxf/EQQvQRtL3DY4T0r1TlkbXmznTpqTh74qKJq++AiAKrWfrQAn2SmphcVIoka1dtFYs2rD2xT2/LtxvPFqaZw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@fouradata%2fmcp@0.4.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":225417},"main":"dist/server.js","type":"module","types":"./dist/server.d.ts","engines":{"node":">=20.0.0"},"gitHead":"cfa2e083f54d1713fb9959261ded24a0860c7271","mcpName":"ai.foura/mcp","scripts":{"dev":"tsx src/stdio.ts","bump":"node scripts/bump.mjs","lint":"tsc --noEmit","test":"npm run build && npm run test:unit && npm run test:integration:stdio && npm run test:docs","build":"tsc","smoke":"node tests/smoke.mjs","dev:http":"tsx src/http.ts","test:all":"npm run test && npm run test:integration:http","inspector":"npx -y @modelcontextprotocol/inspector tsx src/stdio.ts","test:docs":"node --test --test-reporter=spec 'tests/docs-compliance/**/*.test.mjs'","test:unit":"node --test --test-reporter=spec 'tests/unit/**/*.test.mjs'","start:http":"node dist/http.js","audit:tokens":"node scripts/audit-tokens.mjs","prepublishOnly":"npm run lint && npm run build","test:integration:http":"node --test --test-reporter=spec 'tests/integration-http/**/*.test.mjs'","test:integration:stdio":"node --test --test-concurrency=1 --test-reporter=spec 'tests/integration-stdio/**/*.test.mjs'"},"_npmUser":{"name":"kopoev","email":"kopoev@gmail.com"},"repository":{"url":"git+https://github.com/fouradata/mcp.git","type":"git"},"_npmVersion":"11.13.0","description":"MCP server for the FourA web scraping API - four tools (smart auto-fetch, HTTP request, rotating proxies, full browser) plus six prompts, usable from any MCP client.","directories":{},"_nodeVersion":"24.17.0","dependencies":{"zod":"^4.4.3","undici":"^8.2.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","typescript":"^6.0.3","@types/node":"^24.13.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.4.4_1782921990886_0.4151958777613256","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"@fouradata/mcp","version":"0.4.5","keywords":["mcp","mcp-server","model-context-protocol","claude","cursor","ai-agents","llm-tools","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"license":"MIT","_id":"@fouradata/mcp@0.4.5","maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"homepage":"https://foura.ai/mcp","bugs":{"url":"https://github.com/fouradata/mcp/issues"},"bin":{"mcp":"bin/foura-mcp.js","foura-mcp":"bin/foura-mcp.js"},"dist":{"shasum":"7bd67f4099557337ae243d78c81063233e0f356b","tarball":"https://registry.npmjs.org/@fouradata/mcp/-/mcp-0.4.5.tgz","fileCount":40,"integrity":"sha512-nsIy0c/95N883bpawTB0eyrnep1VnXSJb+z7Eyewf0kc6Hk4Z/DciuA2UNSJ2uGfirNwNtyRUZGTxhnjrcNlRg==","signatures":[{"sig":"MEUCIDgrhAaJMQ28NUrvGx1PooKTsQj881zE5E5HP0mLC0CeAiEAz1WHz4hLMVj2k8agVi7e8/V3yQM8JVnGACkMk1ikN6Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@fouradata%2fmcp@0.4.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":227892},"main":"dist/server.js","type":"module","types":"./dist/server.d.ts","engines":{"node":">=20.0.0"},"gitHead":"880d8513eb0d6748de1ed1d39b90dc5a586b7c73","mcpName":"ai.foura/mcp","scripts":{"dev":"tsx src/stdio.ts","bump":"node scripts/bump.mjs","lint":"tsc --noEmit","test":"npm run build && npm run test:unit && npm run test:integration:stdio && npm run test:docs","build":"tsc","smoke":"node tests/smoke.mjs","dev:http":"tsx src/http.ts","test:all":"npm run test && npm run test:integration:http","inspector":"npx -y @modelcontextprotocol/inspector tsx src/stdio.ts","test:docs":"node --test --test-reporter=spec 'tests/docs-compliance/**/*.test.mjs'","test:unit":"node --test --test-reporter=spec 'tests/unit/**/*.test.mjs'","start:http":"node dist/http.js","audit:tokens":"node scripts/audit-tokens.mjs","prepublishOnly":"npm run lint && npm run build","test:integration:http":"node --test --test-reporter=spec 'tests/integration-http/**/*.test.mjs'","test:integration:stdio":"node --test --test-concurrency=1 --test-reporter=spec 'tests/integration-stdio/**/*.test.mjs'"},"_npmUser":{"name":"kopoev","email":"kopoev@gmail.com"},"repository":{"url":"git+https://github.com/fouradata/mcp.git","type":"git"},"_npmVersion":"11.16.0","description":"MCP server for the FourA web scraping API - four tools (smart auto-fetch, HTTP request, rotating proxies, full browser) plus six prompts, usable from any MCP client.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","undici":"^8.2.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","typescript":"^6.0.3","@types/node":"^24.13.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.4.5_1782923649700_0.2908976118672797","host":"s3://npm-registry-packages-npm-production"}},"0.4.6":{"name":"@fouradata/mcp","version":"0.4.6","keywords":["mcp","mcp-server","model-context-protocol","claude","cursor","ai-agents","llm-tools","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"license":"MIT","_id":"@fouradata/mcp@0.4.6","maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"homepage":"https://foura.ai/mcp","bugs":{"url":"https://github.com/fouradata/mcp/issues"},"bin":{"mcp":"bin/foura-mcp.js","foura-mcp":"bin/foura-mcp.js"},"dist":{"shasum":"bd9aafed7ec7263fd9facef787806d34e4e69f14","tarball":"https://registry.npmjs.org/@fouradata/mcp/-/mcp-0.4.6.tgz","fileCount":40,"integrity":"sha512-GKKRXli7PXOUDrfeClYhfhk1tflwEIZIhtHPd9ITeIvVCxSRJnhZIUmiVknm8L/0l+O2XGqmKKrLmCHuHMcezA==","signatures":[{"sig":"MEYCIQDxmcrlpaHyoMoNqV76JiLumhD+2CIGHw3c7gfHhvT8ugIhAKFIigSMH+QUrfu8Xklw2pI5F+hxEdGx6O4HrSZWmQtl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@fouradata%2fmcp@0.4.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":229929},"main":"dist/server.js","type":"module","types":"./dist/server.d.ts","engines":{"node":">=20.0.0"},"gitHead":"26c148f0f02b2499afe2f39e37f4de66e4df4228","mcpName":"ai.foura/mcp","scripts":{"dev":"tsx src/stdio.ts","bump":"node scripts/bump.mjs","lint":"tsc --noEmit","test":"npm run build && npm run test:unit && npm run test:integration:stdio && npm run test:docs","build":"tsc","smoke":"node tests/smoke.mjs","dev:http":"tsx src/http.ts","test:all":"npm run test && npm run test:integration:http","inspector":"npx -y @modelcontextprotocol/inspector tsx src/stdio.ts","test:docs":"node --test --test-reporter=spec 'tests/docs-compliance/**/*.test.mjs'","test:unit":"node --test --test-reporter=spec 'tests/unit/**/*.test.mjs'","start:http":"node dist/http.js","audit:tokens":"node scripts/audit-tokens.mjs","prepublishOnly":"npm run lint && npm run build","test:integration:http":"node --test --test-reporter=spec 'tests/integration-http/**/*.test.mjs'","test:integration:stdio":"node --test --test-concurrency=1 --test-reporter=spec 'tests/integration-stdio/**/*.test.mjs'"},"_npmUser":{"name":"kopoev","email":"kopoev@gmail.com"},"repository":{"url":"git+https://github.com/fouradata/mcp.git","type":"git"},"_npmVersion":"11.13.0","description":"MCP server for the FourA web scraping API - four tools (smart auto-fetch, HTTP request, rotating proxies, full browser) plus six prompts, usable from any MCP client.","directories":{},"_nodeVersion":"24.17.0","dependencies":{"zod":"^4.4.3","undici":"^8.2.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","typescript":"^6.0.3","@types/node":"^24.13.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.4.6_1782924501887_0.5811348510128032","host":"s3://npm-registry-packages-npm-production"}},"0.4.7":{"name":"@fouradata/mcp","version":"0.4.7","keywords":["mcp","mcp-server","model-context-protocol","claude","cursor","ai-agents","llm-tools","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"license":"MIT","_id":"@fouradata/mcp@0.4.7","maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"homepage":"https://foura.ai/mcp","bugs":{"url":"https://github.com/fouradata/mcp/issues"},"bin":{"mcp":"bin/foura-mcp.js","foura-mcp":"bin/foura-mcp.js"},"dist":{"shasum":"7d108cfd3cb87c1d69ca52c93dacca336ec25b00","tarball":"https://registry.npmjs.org/@fouradata/mcp/-/mcp-0.4.7.tgz","fileCount":40,"integrity":"sha512-4tE1cWGCK9RJh7cAYHLIycCYeV1N0VuXvrZUUrkujZQB7F67o/t02wEOtOkdZ8HMDcKNVz1EokjVNifmNvDOtg==","signatures":[{"sig":"MEYCIQDvuCZCEeYRb+KhGv141BVXh8aP+S+Jt5DHmHjVcgMiSAIhAM6z5HtLz/BIq4OmO+BcGuk+I4VRPmw72SYw3vrwii5x","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@fouradata%2fmcp@0.4.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":229929},"main":"dist/server.js","type":"module","types":"./dist/server.d.ts","engines":{"node":">=20.0.0"},"gitHead":"35e72eaa2851217e160776de76f3cb8e78d362c8","mcpName":"ai.foura/mcp","scripts":{"dev":"tsx src/stdio.ts","bump":"node scripts/bump.mjs","lint":"tsc --noEmit","test":"npm run build && npm run test:unit && npm run test:integration:stdio && npm run test:docs","build":"tsc","smoke":"node tests/smoke.mjs","dev:http":"tsx src/http.ts","test:all":"npm run test && npm run test:integration:http","inspector":"npx -y @modelcontextprotocol/inspector tsx src/stdio.ts","test:docs":"node --test --test-reporter=spec 'tests/docs-compliance/**/*.test.mjs'","test:unit":"node --test --test-reporter=spec 'tests/unit/**/*.test.mjs'","start:http":"node dist/http.js","audit:tokens":"node scripts/audit-tokens.mjs","prepublishOnly":"npm run lint && npm run build","test:integration:http":"node --test --test-reporter=spec 'tests/integration-http/**/*.test.mjs'","test:integration:stdio":"node --test --test-concurrency=1 --test-reporter=spec 'tests/integration-stdio/**/*.test.mjs'"},"_npmUser":{"name":"kopoev","email":"kopoev@gmail.com"},"repository":{"url":"git+https://github.com/fouradata/mcp.git","type":"git"},"_npmVersion":"11.16.0","description":"MCP server for the FourA web scraping API - four tools (smart auto-fetch, HTTP request, rotating proxies, full browser) plus six prompts, usable from any MCP client.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","undici":"^8.2.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","typescript":"^6.0.3","@types/node":"^24.13.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.4.7_1782924887337_0.4628496060513603","host":"s3://npm-registry-packages-npm-production"}},"0.4.8":{"name":"@fouradata/mcp","version":"0.4.8","keywords":["mcp","mcp-server","model-context-protocol","claude","cursor","ai-agents","llm-tools","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"license":"MIT","_id":"@fouradata/mcp@0.4.8","maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"homepage":"https://foura.ai/mcp","bugs":{"url":"https://github.com/fouradata/mcp/issues"},"bin":{"mcp":"bin/foura-mcp.js","foura-mcp":"bin/foura-mcp.js"},"dist":{"shasum":"f6689aa4682e32cd35d1b406b50ae437f46d8e29","tarball":"https://registry.npmjs.org/@fouradata/mcp/-/mcp-0.4.8.tgz","fileCount":40,"integrity":"sha512-tNTJb0Bxih+YUFJrUnhHpKlVnPCgpt254/jvFhdB7XCwJnpmog1W+SQcXLzpFprM9RTw5NjDoqreI4tBA9c4AA==","signatures":[{"sig":"MEYCIQCiS2OUjjafpueuyS6zMKZXTdKSaLM43PdguEGf6U0ZegIhAPPHAiDMdhgrw1Xs2HAUhsYJLkuKKJiQ2ihRFf8sFBSx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@fouradata%2fmcp@0.4.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":230990},"main":"dist/server.js","type":"module","types":"./dist/server.d.ts","engines":{"node":">=22.11.0"},"gitHead":"d107e780b518b53e476cefcda769d1b89fc0e22a","mcpName":"ai.foura/mcp","scripts":{"dev":"tsx src/stdio.ts","bump":"node scripts/bump.mjs","lint":"tsc --noEmit","test":"npm run build && npm run test:unit && npm run test:integration:stdio && npm run test:docs","build":"tsc","smoke":"node tests/smoke.mjs","dev:http":"tsx src/http.ts","test:all":"npm run test && npm run test:integration:http","inspector":"npx -y @modelcontextprotocol/inspector tsx src/stdio.ts","test:docs":"node --test --test-reporter=spec 'tests/docs-compliance/**/*.test.mjs'","test:unit":"node --test --test-reporter=spec 'tests/unit/**/*.test.mjs'","start:http":"node dist/http.js","audit:tokens":"node scripts/audit-tokens.mjs","prepublishOnly":"npm run lint && npm run build","test:integration:http":"node --test --test-reporter=spec 'tests/integration-http/**/*.test.mjs'","test:integration:stdio":"node --test --test-concurrency=1 --test-reporter=spec 'tests/integration-stdio/**/*.test.mjs'"},"_npmUser":{"name":"kopoev","email":"kopoev@gmail.com"},"repository":{"url":"git+https://github.com/fouradata/mcp.git","type":"git"},"_npmVersion":"11.13.0","description":"MCP server for the FourA web scraping API - four tools (smart auto-fetch, HTTP request, rotating proxies, full browser) plus six prompts, usable from any MCP client.","directories":{},"_nodeVersion":"24.17.0","dependencies":{"zod":"^4.4.3","undici":"^8.2.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","typescript":"^6.0.3","@types/node":"^24.13.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.4.8_1782994394446_0.4525714734036168","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@fouradata/mcp","version":"0.5.0","keywords":["mcp","mcp-server","model-context-protocol","claude","cursor","ai-agents","llm-tools","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"license":"MIT","_id":"@fouradata/mcp@0.5.0","maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"homepage":"https://foura.ai/mcp","bugs":{"url":"https://github.com/fouradata/mcp/issues"},"bin":{"mcp":"bin/foura-mcp.js","foura-mcp":"bin/foura-mcp.js"},"dist":{"shasum":"220d6312c50d7fc5c76d16ffd88ea187d33b45c1","tarball":"https://registry.npmjs.org/@fouradata/mcp/-/mcp-0.5.0.tgz","fileCount":40,"integrity":"sha512-ZUIr/eoKayDOP1xARk+zmOAw5b41Oimd7dM7d/CkGCG+JJ4QUTWklLIKnEi5XYHgN7J6Qo5RokEi2uTPzWDWNw==","signatures":[{"sig":"MEUCIB/4baWQpfQ61xBUf0nVKLx/FENVrk3rAbwuL8OAVpeSAiEAheAilZ0UWl4O6E0tKW/+5/qByWlAJ+XL7q70xmHlCVI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@fouradata%2fmcp@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":216345},"main":"dist/server.js","type":"module","types":"./dist/server.d.ts","engines":{"node":">=22.19.0"},"gitHead":"20e0519b10b7ef56453d0267a5c76d7613e2eb84","mcpName":"ai.foura/mcp","scripts":{"dev":"tsx src/stdio.ts","bump":"node scripts/bump.mjs","lint":"tsc --noEmit","test":"npm run build && npm run test:unit && npm run test:integration:stdio && npm run test:docs","build":"tsc","smoke":"node tests/smoke.mjs","test:ci":"npm run lint && npm run build && npm run test:unit && npm run test:integration:stdio:mocked && npm run test:docs && npm run test:syntax && npm run audit:tokens && npm run audit:package","dev:http":"tsx src/http.ts","test:all":"npm run test && npm run test:integration:http","inspector":"npx -y @modelcontextprotocol/inspector tsx src/stdio.ts","test:docs":"node --test --test-reporter=spec 'tests/docs-compliance/**/*.test.mjs'","test:unit":"node --test --test-reporter=spec 'tests/unit/**/*.test.mjs'","start:http":"node dist/http.js","test:syntax":"node scripts/check-test-syntax.mjs","audit:tokens":"node scripts/audit-tokens.mjs","audit:package":"node scripts/audit-package.mjs","prepublishOnly":"npm run test:ci","verify:release":"node scripts/verify-release-tag.mjs","test:integration:http":"node --test --test-reporter=spec 'tests/integration-http/**/*.test.mjs'","test:integration:stdio":"node --test --test-concurrency=1 --test-reporter=spec 'tests/integration-stdio/**/*.test.mjs'","test:integration:stdio:mocked":"node --test --test-concurrency=1 --test-reporter=spec tests/integration-stdio/proxy-exit-country-contract.test.mjs tests/integration-stdio/tool-guidance-contract.test.mjs"},"_npmUser":{"name":"kopoev","email":"kopoev@gmail.com"},"repository":{"url":"git+https://github.com/fouradata/mcp.git","type":"git"},"_npmVersion":"11.16.0","description":"Web access for AI agents - smart HTTP, rotating proxy, and full-browser tools plus six ready-made workflows.","directories":{},"_nodeVersion":"24.18.0","allowScripts":{"esbuild@0.28.1":true,"fsevents@2.3.3":true},"dependencies":{"zod":"^4.4.3","undici":"^8.2.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.1","typescript":"^6.0.3","@types/node":"^24.13.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.5.0_1783943850716_0.7201063155221263","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@fouradata/mcp","version":"0.6.0","keywords":["mcp","mcp-server","model-context-protocol","claude","cursor","ai-agents","llm-tools","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"license":"MIT","_id":"@fouradata/mcp@0.6.0","maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"homepage":"https://foura.ai/mcp","bugs":{"url":"https://github.com/fouradata/mcp/issues"},"bin":{"mcp":"bin/foura-mcp.js","foura-mcp":"bin/foura-mcp.js"},"dist":{"shasum":"88a26b89174525d61253b55369d912d71ed69701","tarball":"https://registry.npmjs.org/@fouradata/mcp/-/mcp-0.6.0.tgz","fileCount":40,"integrity":"sha512-12IF2DTOS97Qrc6cXC2B60EmAYUOyKCQcqhvnaPQCO4DElRaDzsLN95UHKyoBXeiWGp4vSy7zTHZMc8Ieyj9Jg==","signatures":[{"sig":"MEQCICCpFH962Iev2ZRIPYfM4PAmT1vMPP9mv/Gp1fRXhmCEAiAqgEogSmu7bD1muXp7H8vVWDtKHdswrvMQW1DQQ8UFfg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@fouradata%2fmcp@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":223115},"main":"dist/server.js","type":"module","types":"./dist/server.d.ts","engines":{"node":">=22.19.0"},"gitHead":"fd805906589e89a6127eb7f3afa1607e042f59e8","mcpName":"ai.foura/mcp","scripts":{"dev":"tsx src/stdio.ts","bump":"node scripts/bump.mjs","lint":"tsc --noEmit","test":"npm run build && npm run test:unit && npm run test:integration:stdio && npm run test:docs","build":"tsc","smoke":"node tests/smoke.mjs","test:ci":"npm run lint && npm run build && npm run test:unit && npm run test:integration:stdio:mocked && npm run test:integration:http:local && npm run test:docs && npm run test:syntax && npm run audit:tokens && npm run audit:package","dev:http":"tsx src/http.ts","test:all":"npm run test && npm run test:integration:http","inspector":"npx -y @modelcontextprotocol/inspector tsx src/stdio.ts","test:docs":"node --test --test-reporter=spec 'tests/docs-compliance/**/*.test.mjs'","test:unit":"node --test --test-reporter=spec 'tests/unit/**/*.test.mjs'","start:http":"node dist/http.js","test:syntax":"node scripts/check-test-syntax.mjs","audit:tokens":"node scripts/audit-tokens.mjs","audit:package":"node scripts/audit-package.mjs","prepublishOnly":"npm run test:ci","verify:release":"node scripts/verify-release-tag.mjs","test:integration:http":"node --test --test-reporter=spec 'tests/integration-http/**/*.test.mjs'","test:integration:stdio":"node --test --test-concurrency=1 --test-reporter=spec 'tests/integration-stdio/**/*.test.mjs'","test:integration:http:local":"node --test --test-concurrency=1 --test-reporter=spec tests/integration-http/audit-hardening.test.mjs","test:integration:stdio:mocked":"node --test --test-concurrency=1 --test-reporter=spec tests/integration-stdio/proxy-exit-country-contract.test.mjs tests/integration-stdio/tool-guidance-contract.test.mjs tests/integration-stdio/browser-profile-contract.test.mjs"},"_npmUser":{"name":"kopoev","email":"kopoev@gmail.com"},"repository":{"url":"git+https://github.com/fouradata/mcp.git","type":"git"},"_npmVersion":"11.16.0","description":"Web access for AI agents - smart HTTP, rotating proxy, and full-browser tools plus six ready-made workflows.","directories":{},"_nodeVersion":"24.18.0","allowScripts":{"esbuild@0.28.1":true,"fsevents@2.3.3":true},"dependencies":{"zod":"^4.4.3","undici":"^8.9.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.5","typescript":"^7.0.2","@types/node":"^24.13.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.6.0_1786003154707_0.5155215445213757","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@fouradata/mcp","version":"0.7.0","keywords":["mcp","mcp-server","model-context-protocol","claude","cursor","ai-agents","llm-tools","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"license":"MIT","_id":"@fouradata/mcp@0.7.0","maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"homepage":"https://foura.ai/mcp","bugs":{"url":"https://github.com/fouradata/mcp/issues"},"bin":{"mcp":"bin/foura-mcp.js","foura-mcp":"bin/foura-mcp.js"},"dist":{"shasum":"1064353adb81738bad8a32629d3c4169f037022d","tarball":"https://registry.npmjs.org/@fouradata/mcp/-/mcp-0.7.0.tgz","fileCount":43,"integrity":"sha512-CNSSOQRA///jI10/QMBIeIgrLtjqh79KA8/9J3pIfd5pQV08bC3LM8OlVAYTuvAe7w+U9IeNAX/APr5NyyEfJw==","signatures":[{"sig":"MEUCIQDmbHWXtMFxZvGG+/mGHsBRiSNWpfDdV6M/qybAV4QNmQIgHHfsCtWuC0JJXYF7MpMWe+rxNeIRhzVLPyO8wMEgRok=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@fouradata%2fmcp@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":246369},"main":"dist/server.js","type":"module","types":"./dist/server.d.ts","engines":{"node":">=22.19.0"},"gitHead":"3eaf92340ab94d60136df53086ff53e27cdfa642","mcpName":"ai.foura/mcp","scripts":{"dev":"tsx src/stdio.ts","bump":"node scripts/bump.mjs","lint":"tsc --noEmit","test":"npm run build && npm run test:unit && npm run test:integration:stdio && npm run test:docs","build":"tsc","smoke":"node tests/smoke.mjs","test:ci":"npm run lint && npm run build && npm run test:unit && npm run test:integration:stdio:mocked && npm run test:integration:http:local && npm run test:docs && npm run test:syntax && npm run audit:tokens && npm run audit:package","dev:http":"tsx src/http.ts","test:all":"npm run test && npm run test:integration:http","inspector":"npx -y @modelcontextprotocol/inspector tsx src/stdio.ts","test:docs":"node --test --test-reporter=spec 'tests/docs-compliance/**/*.test.mjs'","test:unit":"node --test --test-reporter=spec 'tests/unit/**/*.test.mjs'","start:http":"node dist/http.js","test:syntax":"node scripts/check-test-syntax.mjs","audit:tokens":"node scripts/audit-tokens.mjs","audit:package":"node scripts/audit-package.mjs","prepublishOnly":"npm run test:ci","verify:release":"node scripts/verify-release-tag.mjs","test:integration:http":"node --test --test-reporter=spec 'tests/integration-http/**/*.test.mjs'","test:integration:stdio":"node --test --test-concurrency=1 --test-reporter=spec 'tests/integration-stdio/**/*.test.mjs'","test:integration:http:local":"node --test --test-concurrency=1 --test-reporter=spec tests/integration-http/audit-hardening.test.mjs","test:integration:stdio:mocked":"node --test --test-concurrency=1 --test-reporter=spec tests/integration-stdio/proxy-exit-country-contract.test.mjs tests/integration-stdio/tool-guidance-contract.test.mjs tests/integration-stdio/browser-profile-contract.test.mjs tests/integration-stdio/api-signals-contract.test.mjs"},"_npmUser":{"name":"kopoev","email":"kopoev@gmail.com"},"repository":{"url":"git+https://github.com/fouradata/mcp.git","type":"git"},"_npmVersion":"11.19.0","description":"Web access for AI agents - smart HTTP, rotating proxy, and full-browser tools plus six ready-made workflows.","directories":{},"_nodeVersion":"24.20.0","allowScripts":{"esbuild@0.28.2":true,"fsevents@2.3.3":true},"dependencies":{"zod":"^4.4.3","undici":"^8.9.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.5","typescript":"^7.0.2","@types/node":"^24.13.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.7.0_1789539741302_0.9433131791996701","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@fouradata/mcp","version":"0.7.1","keywords":["mcp","mcp-server","model-context-protocol","claude","cursor","ai-agents","llm-tools","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"license":"MIT","_id":"@fouradata/mcp@0.7.1","maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"homepage":"https://foura.ai/mcp","bugs":{"url":"https://github.com/fouradata/mcp/issues"},"bin":{"mcp":"bin/foura-mcp.js","foura-mcp":"bin/foura-mcp.js"},"dist":{"shasum":"fbb5b8cce0a2eea0286a445ad6e490bbd7d4d50c","tarball":"https://registry.npmjs.org/@fouradata/mcp/-/mcp-0.7.1.tgz","fileCount":43,"integrity":"sha512-rO/DMkc4dQajVKJcCAsr9A1jcOUg31uVrl7eySWMDeGO2a729o8is7VWluSBBgj6sbW9S/x+iXHNWlT1L9Nh3g==","signatures":[{"sig":"MEUCIG47gT+c6jckBfCFiVMzHlLh1Df82Hfd3S1QH2lQCmmRAiEA1ZKKzJnHtvoGqJVT21O1ZCr8PGCqctgzeSphYUkBScQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@fouradata%2fmcp@0.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":249944},"main":"dist/server.js","type":"module","types":"./dist/server.d.ts","engines":{"node":">=22.19.0"},"gitHead":"1ed668989e6d8f55ee2dd2d402e20f84bdb42c4b","mcpName":"ai.foura/mcp","scripts":{"dev":"tsx src/stdio.ts","bump":"node scripts/bump.mjs","lint":"tsc --noEmit","test":"npm run build && npm run test:unit && npm run test:integration:stdio && npm run test:docs","build":"tsc","smoke":"node tests/smoke.mjs","test:ci":"npm run lint && npm run build && npm run test:unit && npm run test:integration:stdio:mocked && npm run test:integration:http:local && npm run test:docs && npm run test:syntax && npm run audit:tokens && npm run audit:package","dev:http":"tsx src/http.ts","test:all":"npm run test && npm run test:integration:http","inspector":"npx -y @modelcontextprotocol/inspector tsx src/stdio.ts","test:docs":"node --test --test-reporter=spec 'tests/docs-compliance/**/*.test.mjs'","test:unit":"node --test --test-reporter=spec 'tests/unit/**/*.test.mjs'","start:http":"node dist/http.js","test:syntax":"node scripts/check-test-syntax.mjs","audit:tokens":"node scripts/audit-tokens.mjs","audit:package":"node scripts/audit-package.mjs","prepublishOnly":"npm run test:ci","verify:release":"node scripts/verify-release-tag.mjs","test:integration:http":"node --test --test-reporter=spec 'tests/integration-http/**/*.test.mjs'","test:integration:stdio":"node --test --test-concurrency=1 --test-reporter=spec 'tests/integration-stdio/**/*.test.mjs'","test:integration:http:local":"node --test --test-concurrency=1 --test-reporter=spec tests/integration-http/audit-hardening.test.mjs","test:integration:stdio:mocked":"node --test --test-concurrency=1 --test-reporter=spec tests/integration-stdio/proxy-exit-country-contract.test.mjs tests/integration-stdio/tool-guidance-contract.test.mjs tests/integration-stdio/browser-profile-contract.test.mjs tests/integration-stdio/api-signals-contract.test.mjs"},"_npmUser":{"name":"kopoev","email":"kopoev@gmail.com"},"repository":{"url":"git+https://github.com/fouradata/mcp.git","type":"git"},"_npmVersion":"11.19.0","description":"Web access for AI agents - smart HTTP, rotating proxy, and full-browser tools plus six ready-made workflows.","directories":{},"_nodeVersion":"24.20.0","allowScripts":{"esbuild@0.28.2":true,"fsevents@2.3.3":true},"dependencies":{"zod":"^4.4.3","undici":"^8.9.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.5","typescript":"^7.0.2","@types/node":"^24.13.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.7.1_1789542388078_0.49567089730461467","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"@fouradata/mcp","version":"0.7.2","keywords":["mcp","mcp-server","model-context-protocol","claude","cursor","ai-agents","llm-tools","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"license":"MIT","_id":"@fouradata/mcp@0.7.2","maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"homepage":"https://foura.ai/mcp","bugs":{"url":"https://github.com/fouradata/mcp/issues"},"bin":{"mcp":"bin/foura-mcp.js","foura-mcp":"bin/foura-mcp.js"},"dist":{"shasum":"dbe92d0d0d7809a25a15d8820d0aab65ed50abc7","tarball":"https://registry.npmjs.org/@fouradata/mcp/-/mcp-0.7.2.tgz","fileCount":43,"integrity":"sha512-9o5zthGqb85QnMKaKvsQWJ+hvPxvSzzadql0DyRAJRtGoZqZzdl5GT5CCvjDRCUGFEHd2bGT2myUjXq39bxXdA==","signatures":[{"sig":"MEUCIAMn+yJPgpTz4KAQbDwtv+2Ux/ldhoG1hnQyxsFmd073AiEA7J6ja+G/KasypgDtgdYkhqw1OdTyi/14mRl1Edop7uo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@fouradata%2fmcp@0.7.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":250352},"main":"dist/server.js","type":"module","types":"./dist/server.d.ts","engines":{"node":">=22.19.0"},"gitHead":"0e59621ceab146d5220dbd228af1b9a8da9326d7","mcpName":"ai.foura/mcp","scripts":{"dev":"tsx src/stdio.ts","bump":"node scripts/bump.mjs","lint":"tsc --noEmit","test":"npm run build && npm run test:unit && npm run test:integration:stdio && npm run test:docs","build":"tsc","smoke":"node tests/smoke.mjs","test:ci":"npm run lint && npm run build && npm run test:unit && npm run test:integration:stdio:mocked && npm run test:integration:http:local && npm run test:docs && npm run test:syntax && npm run audit:tokens && npm run audit:package","dev:http":"tsx src/http.ts","test:all":"npm run test && npm run test:integration:http","inspector":"npx -y @modelcontextprotocol/inspector tsx src/stdio.ts","test:docs":"node --test --test-reporter=spec 'tests/docs-compliance/**/*.test.mjs'","test:unit":"node --test --test-reporter=spec 'tests/unit/**/*.test.mjs'","start:http":"node dist/http.js","test:syntax":"node scripts/check-test-syntax.mjs","audit:tokens":"node scripts/audit-tokens.mjs","audit:package":"node scripts/audit-package.mjs","prepublishOnly":"npm run test:ci","verify:release":"node scripts/verify-release-tag.mjs","test:integration:http":"node --test --test-reporter=spec 'tests/integration-http/**/*.test.mjs'","test:integration:stdio":"node --test --test-concurrency=1 --test-reporter=spec 'tests/integration-stdio/**/*.test.mjs'","test:integration:http:local":"node --test --test-concurrency=1 --test-reporter=spec tests/integration-http/audit-hardening.test.mjs","test:integration:stdio:mocked":"node --test --test-concurrency=1 --test-reporter=spec tests/integration-stdio/proxy-exit-country-contract.test.mjs tests/integration-stdio/tool-guidance-contract.test.mjs tests/integration-stdio/browser-profile-contract.test.mjs tests/integration-stdio/api-signals-contract.test.mjs"},"_npmUser":{"name":"kopoev","email":"kopoev@gmail.com"},"repository":{"url":"git+https://github.com/fouradata/mcp.git","type":"git"},"_npmVersion":"11.19.0","description":"Web access for AI agents - smart HTTP, rotating proxy, and full-browser tools plus six ready-made workflows.","directories":{},"_nodeVersion":"24.20.0","allowScripts":{"esbuild@0.28.2":true,"fsevents@2.3.3":true},"dependencies":{"zod":"^4.4.3","undici":"^8.9.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.5","typescript":"^7.0.2","@types/node":"^24.13.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.7.2_1789643300684_0.801816861017419","host":"s3://npm-registry-packages-npm-production"}},"0.7.3":{"_id":"@fouradata/mcp@0.7.3","bin":{"mcp":"bin/foura-mcp.js","foura-mcp":"bin/foura-mcp.js"},"bugs":{"url":"https://github.com/fouradata/mcp/issues"},"dist":{"shasum":"cad693a07d9946181133b930713057898f5c45d7","tarball":"https://registry.npmjs.org/@fouradata/mcp/-/mcp-0.7.3.tgz","fileCount":43,"integrity":"sha512-r8mSHGmVxkKuh/8pvgsE9TpXdVEANGWJATiDEoSky0H8LTE6iR69CvXUy399BwsYEZ04tycMqs+9TijfUYlI0w==","signatures":[{"sig":"MEYCIQDVwPwaIZlIosxkidlofphPG1wc5Z5LiWG9WaLd6WvvXAIhANGkknJROsevOBErtXUNCElOoJ0CepDs6dMho93PZMlw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCmVFwlbXu/n3LL+1oJtEQJs3J6LVoBttL9BZ2gqPjnhQIhANpuKhE6hlY6Y6oDhfBndra3cN/1aV1BDMi7xhDZ/NiC"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@fouradata%2fmcp@0.7.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":253618},"main":"dist/server.js","name":"@fouradata/mcp","type":"module","types":"./dist/server.d.ts","engines":{"node":">=22.19.0"},"gitHead":"e8a8dd2ff8301e2e48fde0eebb8e30f3b8e2aa8d","license":"MIT","mcpName":"ai.foura/mcp","scripts":{"dev":"tsx src/stdio.ts","bump":"node scripts/bump.mjs","lint":"tsc --noEmit","test":"npm run build && npm run test:unit && npm run test:integration:stdio && npm run test:docs","build":"tsc","smoke":"node tests/smoke.mjs","test:ci":"npm run lint && npm run build && npm run test:unit && npm run test:integration:stdio:mocked && npm run test:integration:http:local && npm run test:docs && npm run test:syntax && npm run audit:tokens && npm run audit:package","dev:http":"tsx src/http.ts","test:all":"npm run test && npm run test:integration:http","inspector":"npx -y @modelcontextprotocol/inspector tsx src/stdio.ts","test:docs":"node --test --test-reporter=spec 'tests/docs-compliance/**/*.test.mjs'","test:unit":"node --test --test-reporter=spec 'tests/unit/**/*.test.mjs'","start:http":"node dist/http.js","test:syntax":"node scripts/check-test-syntax.mjs","audit:tokens":"node scripts/audit-tokens.mjs","audit:package":"node scripts/audit-package.mjs","prepublishOnly":"npm run test:ci","verify:release":"node scripts/verify-release-tag.mjs","test:integration:http":"node --test --test-reporter=spec 'tests/integration-http/**/*.test.mjs'","test:integration:stdio":"node --test --test-concurrency=1 --test-reporter=spec 'tests/integration-stdio/**/*.test.mjs'","test:integration:http:local":"node --test --test-concurrency=1 --test-reporter=spec tests/integration-http/audit-hardening.test.mjs","test:integration:stdio:mocked":"node --test --test-concurrency=1 --test-reporter=spec tests/integration-stdio/proxy-exit-country-contract.test.mjs tests/integration-stdio/tool-guidance-contract.test.mjs tests/integration-stdio/browser-profile-contract.test.mjs tests/integration-stdio/api-signals-contract.test.mjs tests/integration-stdio/schema-dialect-contract.test.mjs"},"version":"0.7.3","_npmUser":{"name":"kopoev","email":"kopoev@gmail.com"},"homepage":"https://foura.ai/mcp","keywords":["mcp","mcp-server","model-context-protocol","claude","cursor","ai-agents","llm-tools","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"repository":{"url":"git+https://github.com/fouradata/mcp.git","type":"git"},"_npmVersion":"11.19.0","description":"Web access for AI agents - smart HTTP, rotating proxy, and full-browser tools plus six ready-made workflows.","directories":{},"maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"_nodeVersion":"24.21.0","allowScripts":{"esbuild@0.28.2":true,"fsevents@2.3.3":true},"dependencies":{"zod":"^4.4.3","undici":"^8.9.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"ajv":"^8.20.0","tsx":"^4.23.5","typescript":"^7.0.2","@types/node":"^24.13.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp_0.7.3_1790111741569_0.6996382454549281"}}},"time":{"created":"2026-05-13T10:08:07.065Z","modified":"2026-09-22T21:15:42.869Z","0.1.0":"2026-05-13T10:08:07.356Z","0.1.1":"2026-05-13T10:16:14.704Z","0.1.2":"2026-05-13T10:19:22.908Z","0.1.3":"2026-05-13T11:39:43.795Z","0.1.4":"2026-05-13T14:35:45.420Z","0.1.5":"2026-05-13T14:46:29.506Z","0.1.6":"2026-05-13T15:38:02.401Z","0.1.7":"2026-05-14T08:44:57.980Z","0.2.0":"2026-05-14T18:18:50.743Z","0.2.1":"2026-05-14T19:54:45.304Z","0.2.2":"2026-05-14T20:04:58.567Z","0.2.3":"2026-05-14T20:46:23.250Z","0.2.6":"2026-05-14T21:28:25.706Z","0.2.7":"2026-05-14T21:46:03.633Z","0.2.8":"2026-05-14T22:02:29.480Z","0.2.9":"2026-05-14T22:29:42.869Z","0.2.10":"2026-05-14T23:08:08.980Z","0.2.11":"2026-05-15T08:15:23.056Z","0.3.0":"2026-06-30T18:09:31.626Z","0.3.1":"2026-07-01T04:55:47.537Z","0.3.2":"2026-07-01T05:53:15.716Z","0.3.3":"2026-07-01T06:14:00.943Z","0.4.0":"2026-07-01T10:28:23.742Z","0.4.1":"2026-07-01T11:28:56.831Z","0.4.2":"2026-07-01T15:38:31.147Z","0.4.3":"2026-07-01T15:46:25.505Z","0.4.4":"2026-07-01T16:06:31.036Z","0.4.5":"2026-07-01T16:34:09.884Z","0.4.6":"2026-07-01T16:48:22.045Z","0.4.7":"2026-07-01T16:54:47.490Z","0.4.8":"2026-07-02T12:13:14.627Z","0.5.0":"2026-07-13T11:57:30.863Z","0.6.0":"2026-08-06T07:59:14.840Z","0.7.0":"2026-09-16T06:22:21.425Z","0.7.1":"2026-09-16T07:06:28.224Z","0.7.2":"2026-09-17T11:08:20.849Z","0.7.3":"2026-09-22T21:15:41.656Z"},"bugs":{"url":"https://github.com/fouradata/mcp/issues"},"license":"MIT","homepage":"https://foura.ai/mcp","keywords":["mcp","mcp-server","model-context-protocol","claude","cursor","ai-agents","llm-tools","foura","web-scraping","scraping-api","rotating-proxies","anti-bot","browser-automation"],"repository":{"url":"git+https://github.com/fouradata/mcp.git","type":"git"},"description":"Web access for AI agents - smart HTTP, rotating proxy, and full-browser tools plus six ready-made workflows.","maintainers":[{"name":"kopoev","email":"kopoev@gmail.com"}],"readme":"<!-- mcp-name: ai.foura/mcp -->\n<p align=\"center\">\n  <a href=\"https://foura.ai/mcp\"><img src=\"https://foura.ai/logo/avatars/4a-transparent-indigo-512.png\" width=\"96\" alt=\"FourA\"></a>\n</p>\n\n<h1 align=\"center\">FourA MCP</h1>\n\n<p align=\"center\"><strong>Reliable web access for AI agents.</strong></p>\n\n<p align=\"center\">\n  Give your agent a public URL. FourA returns the content, whether the page needs a fast HTTP request,\n  proxy rotation, or a full browser session.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/@fouradata/mcp\"><img src=\"https://img.shields.io/npm/v/@fouradata/mcp?logo=npm&color=cb3837\" alt=\"npm version\"></a>\n  <a href=\"https://www.npmjs.com/package/@fouradata/mcp\"><img src=\"https://img.shields.io/badge/supply_chain-provenance_signed-2ea44f?logo=npm\" alt=\"npm provenance\"></a>\n  <a href=\"./LICENSE\"><img src=\"https://img.shields.io/npm/l/@fouradata/mcp?color=2ea44f\" alt=\"MIT license\"></a>\n  <a href=\"https://glama.ai/mcp/servers/fouradata/mcp\"><img src=\"https://glama.ai/mcp/servers/fouradata/mcp/badges/score.svg\" alt=\"FourA MCP score on Glama\"></a>\n  <a href=\"https://tdqs.dev/reports/ivgtefqu60\"><img src=\"https://tdqs.dev/reports/ivgtefqu60/badge.svg\" alt=\"Tool Definition Quality Score for FourA MCP\"></a>\n  <a href=\"https://smithery.ai/servers/foura/mcp\"><img src=\"https://img.shields.io/badge/Smithery-listed-6e56cf\" alt=\"FourA on Smithery\"></a>\n</p>\n\nStart with `foura_auto`: one URL in, typed content out. It chooses the appropriate fetch method and handles common blocks for you. Use `foura_single`, `foura_proxy`, or `foura_browser` when you want explicit control over the request path.\n\n| Start simple | Reach difficult pages | Build predictable agent flows |\n|---|---|---|\n| One default tool for most URLs | HTTP, proxy rotation, and full-browser rendering | Typed outputs, stable error codes, and six ready-made prompts |\n\nThe included workflows cover product extraction, article cleanup, price monitoring, endpoint checks, and bulk URL fetching.\n\nUse it from Claude Desktop, Claude Code, Cursor, Windsurf, VS Code, or any MCP client. Run the npm package locally or connect to the hosted Streamable HTTP endpoint with the same FourA API key.\n\n**[Get an API key](https://foura.ai/dashboard/#api-keys) | [Read the MCP docs](https://foura.ai/docs/mcp/server) | [See the package on npm](https://www.npmjs.com/package/@fouradata/mcp)**\n\n**One-click install:**\n\n[![Add to Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](cursor://anysphere.cursor-deeplink/mcp/install?name=foura&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBmb3VyYWRhdGEvbWNwIl0sImVudiI6eyJGT1VSQV9BUElfS0VZIjoiWU9VUl9GT1VSQV9BUElfS0VZIn19)\n[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install_Server-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://insiders.vscode.dev/redirect?url=vscode%3Amcp%2Finstall%3F%257B%2522name%2522%253A%2522foura%2522%252C%2522command%2522%253A%2522npx%2522%252C%2522args%2522%253A%255B%2522-y%2522%252C%2522%2540fouradata%252Fmcp%2522%255D%252C%2522env%2522%253A%257B%2522FOURA_API_KEY%2522%253A%2522YOUR_FOURA_API_KEY%2522%257D%257D)\n\nBoth buttons pre-fill the config with a `YOUR_FOURA_API_KEY` placeholder - replace it with your key. Or by hand: `claude mcp add foura -- npx -y @fouradata/mcp` (set `FOURA_API_KEY` in env first). Full per-client setup below.\n\n## Quick Start - local stdio (recommended for Claude Desktop)\n\nCreate or reveal an API key at [foura.ai/dashboard/#api-keys](https://foura.ai/dashboard/#api-keys) (format `pk_live_...`). Then drop this into your MCP client's config:\n\n```json\n{\n  \"mcpServers\": {\n    \"foura\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@fouradata/mcp\"],\n      \"env\": {\n        \"FOURA_API_KEY\": \"pk_live_...\"\n      }\n    }\n  }\n}\n```\n\n> **Claude Desktop gotcha:** fully quit Claude Desktop (`Cmd+Q` on macOS) **before** editing the config file. If the app is still running, it will overwrite your edits with its in-memory config on exit.\n\nThe npx command downloads the package on first launch and runs it as a subprocess of your MCP client. No global install needed. The same JSON works across MCP clients; only the config-file location changes:\n\n| Client | Where the config lives |\n|---|---|\n| Claude Desktop (macOS) | `~/Library/Application Support/Claude/claude_desktop_config.json` |\n| Claude Desktop (Windows) | `%APPDATA%\\Claude\\claude_desktop_config.json` |\n| Claude Code | `claude mcp add foura -- npx -y @fouradata/mcp` (set `FOURA_API_KEY` in env first) |\n| Cursor | `~/.cursor/mcp.json` |\n| Windsurf | `~/.codeium/windsurf/mcp_config.json` |\n| VS Code (MCP extension) | `.vscode/mcp.json` in your workspace |\n\nRestart the client and `foura_auto`, `foura_single`, `foura_proxy`, `foura_browser` show up in your tool list, plus six prompts under `/prompts`.\n\n## Quick Start - hosted (Streamable HTTP)\n\nIf your client supports the Streamable HTTP transport, point it at the hosted endpoint instead of running a local subprocess:\n\n```json\n{\n  \"mcpServers\": {\n    \"foura\": {\n      \"url\": \"https://mcp.foura.ai/mcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer pk_live_...\"\n      }\n    }\n  }\n}\n```\n\nFor Claude Desktop, use the stdio config above. You can also bridge the hosted endpoint through `mcp-remote`:\n\n```json\n{\n  \"mcpServers\": {\n    \"foura\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-remote\", \"https://mcp.foura.ai/mcp\", \"--header\", \"Authorization: Bearer pk_live_...\"]\n    }\n  }\n}\n```\n\n## The Tools\n\n`foura_auto` is the **default** - give it a URL and it returns the content, choosing the fetch method for you. The other three tools give you direct control over HTTP, proxy rotation, and browser rendering.\n\nAll four are marked `readOnlyHint: true` and `openWorldHint: true` per the [MCP specification](https://modelcontextprotocol.io/specification). Clients can use those annotations when deciding how to present or approve tool calls.\n\nEvery response carries human-readable text (`content`) plus a typed `structuredContent` JSON object validated against the tool's `outputSchema`. Your agent gets a predictable response contract instead of parsing prose.\n\n### `foura_auto` - smart fetch (the default)\n\nGive it a URL and get the content back. Use this first when you don't want to choose between HTTP, proxy rotation, and browser rendering. It handles common bot challenges and keeps the client surface small, with no proxy-attempt tuning required.\n\n```jsonc\n{\n  \"url\": \"https://example.com\",\n  // optional: a substring the real page must contain, so auto can tell a\n  // real page from a challenge page on protected targets\n  \"validate\": { \"data\": { \"accept\": [\"Example Domain\"] } }\n}\n```\n\nThe client surface is intentionally minimal: `url` (required), plus optional `method`, `headers`, `data`, `validate`, `returnSession` (default `true`), `forceProxy` (default `true`), `timeout_ms` (5000-180000, default 120000), `ignoreProxies`.\n\n`structuredContent` shape: `{status, headers, data, meta, session}`. `meta` is always present - `{rung, solved, attempts, credits}` - so your agent can see how the request completed and how many credits it used. `session` (`{proxy, cookies, userAgent}`) is returned by default for follow-up requests (pass `session.proxy` into the `proxy` field). Send `returnSession: false` to omit it. There is no `total_time` field on auto.\n\n### `foura_single` - fast HTTP\n\nOne HTTP request, response back. Use it for static pages, JSON APIs, and server-rendered HTML. `unblocker` defaults to `true`, so the request already carries a full browser header set; set it to `false` for a plain HTTP request.\n\n```jsonc\n{\n  \"method\": \"GET\",\n  \"url\": \"https://example.com\"\n}\n```\n\nSupports custom headers, a body, per-stage timeouts, redirect controls, JSON auto-parse, a binary-buffer mode, and built-in response validation (`validate.status.accept`, `validate.data.fail`, and so on). If `foura_single` comes back blocked - status 403/429, a captcha page, challenge response headers, or a known challenge title - try a different browser profile (below), then escalate to `foura_proxy`. Start with `maxTries: 5`; protected targets may need `25-30`. If the page also needs JavaScript to render, pass `foura_proxy`'s returned `proxy` ID to `foura_browser.proxy`.\n\n`structuredContent` shape: `{status, headers, data, total_time, ...}`. When the target ran a bot check, the response also carries `defense`; `defense.solved: false` means the body may be a challenge page rather than the content you asked for.\n\n#### Choosing which browser you present\n\nBy default a request presents the latest Google Chrome. Some targets accept one browser and refuse another, so `foura_single` and `foura_proxy` let you pick:\n\n```jsonc\n{\n  \"method\": \"GET\",\n  \"url\": \"https://example.com\",\n  \"browser\": \"Firefox\",\n  \"os\": \"Windows\"\n}\n```\n\n- `browser` - `Chrome`, `Edge`, `Safari`, `Firefox`, or `Tor`.\n- `os` - `Windows`, `macOS`, `Android`, or `iOS`. A family name accepts any of its versions; the exact labels in the catalogue narrow further.\n- `version` - any version the catalogue lists for that browser. The newest match wins when several fit.\n- `profile` - an exact id from the catalogue, when you already have one.\n\nThe full catalogue is public at [api.foura.ai/api/profiles](https://api.foura.ai/api/profiles), no key required, and its `default` field names the profile a request gets when you ask for nothing. Selection needs `unblocker` on, which is the default. A combination that does not exist returns an error listing what is available, so a request is never quietly sent as a browser you did not choose.\n\n### `foura_proxy` - rotating proxies with retry\n\nSame target shape as `foura_single`, but routed through rotating proxies with automatic retry on failure. Use it when a direct request is blocked or when the target requires a specific exit country.\n\n```jsonc\n{\n  \"maxTries\": 5,\n  \"exitCountries\": [\"CZ\", \"GB\"],\n  \"request\": {\n    \"method\": \"GET\",\n    \"url\": \"https://example.com/pricing\",\n    \"browser\": \"Chrome\",\n    \"os\": \"Windows\"\n  }\n}\n```\n\n`structuredContent` adds `proxy` (the encoded ID of the proxy that succeeded) and `total` (outer timing including selection and retries). When the rotation had to move to another browser family to get an answer, `profile` names the family it settled on; replay with it or the next call repeats the version that failed. `exitCountries` is optional: values are trimmed, uppercased, and deduplicated; proxies with unknown exits are excluded; the request never falls back to an unrequested country. Selection uses the latest available country metadata, normally updated within ten minutes, and a scoped success returns that value as `exitCountry`. If no eligible proxy matches, the result uses `code: \"no_eligible_proxy\"`.\n\nThe inner `request` takes the same browser-profile fields as `foura_single`: `browser`, `os`, `version`, or an exact `profile`.\n\n**`exitClass` - for a target the standard pool cannot reach.** Set `exitClass: \"premium\"` and the request may escalate to a premium exit instead of only rotating within the standard pool. It is an allowance, not an instruction: the standard pool still races for the answer and usually wins, and a request it answers before any premium exit is tried costs no premium traffic. Once a premium exit has been tried, the traffic it carried counts toward your premium allowance even if that attempt failed; an attempt still running when another exit answered is stopped and not counted. The response reports `exitClass` back, `premium` or `standard`, so you can see per request which one served you. `standard` is also the answer once the premium traffic in your plan is spent, and it is a normal result, not an error. `exitClass: \"standard\"` forbids escalation outright. On a plan without premium exits the call is refused with `code: \"plan_limit_premium\"`.\n\n**`attemptReport` - why a rotation ran out of tries.** Every failed `foura_proxy` result carries it beside the error. `summary` is one sentence; the counts underneath separate causes with opposite fixes: `noResponse` (the exit never answered), `defense` (a bot check was recognised, named in `vendors`), `contentRejected` (HTTP 200, no bot check, rejected only by your own `validate.data`), `statusRejected`, and `other`. `profilesTried` lists the browsers the task sent, in first-use order, with `default` meaning the request went out exactly as written. A high `contentRejected` means the pages arrived and your own rule threw them away: fetch one with `foura_single` and no `validate`, look at it, and rewrite the rule.\n\nFor difficult WAF challenges, use `maxTries: 25-30`. For a country allowlist, set `exitCountries` instead of increasing attempts. If the target needs JavaScript rendering, pass the returned `proxy` ID to `foura_browser.proxy`.\n\n### `foura_browser` - full browser session\n\nA real browser session. JavaScript runs, the DOM finishes rendering, cookies come back with the response. Use it when the page is a single-page app, when content lazy-loads after first paint, or when there's an anti-bot challenge that needs a real browser to clear.\n\n```jsonc\n{\n  \"url\": \"https://example.com/spa\",\n  \"timeout_ms\": 15000,\n  \"checkText\": \"data-table\"\n}\n```\n\nUse this when an HTTP response isn't enough. `checkText` validates the rendered HTML once navigation completes; it doesn't wait or poll. If the substring is missing, the call fails with an error envelope. This catches pages that return 200 without the content you need. `unblocker` defaults to `true` and handles supported anti-bot or captcha challenges along the way. Set it to `false` to return the page exactly as it loads, challenge included.\n\n`structuredContent` shape is intentionally different from single/proxy: `{status, headers (object, not array), body (not data), cookies (full browser cookie shape), userAgent}`.\n\n## Built-in Prompts\n\nSix workflow templates surfaced under `/prompts` in your MCP client. They orchestrate one or more tools without you spelling out the steps.\n\n| Prompt | Arguments | What it does |\n|---|---|---|\n| `smart_fetch` | `url, must_contain?, extract?` | Pick the method, handle bot protection, and return or extract content |\n| `scrape_product_page` | `url` | Extract title, price, image, stock, and SKU as JSON in a browser session |\n| `extract_article` | `url` | Fetch an article, retry through a proxy if needed, and remove page chrome |\n| `monitor_pricing` | `url, target_price?` | Fetch the current price and compare it with a target |\n| `check_endpoint_health` | `url, expected_text?` | Validate reachability, status, content, and timing |\n| `bulk_fetch_urls` | `urls` (comma-separated) | Fetch URLs in parallel, retry blocked ones, and return metadata |\n\nEach prompt arrives as a templated user message your LLM executes with the right tools. The full prompt text enters the context only when you invoke it.\n\nFull recipe text + manual fallback prompts: [foura.ai/docs/mcp/recipes](https://foura.ai/docs/mcp/recipes). For the full error code list, see [foura.ai/docs/mcp/errors](https://foura.ai/docs/mcp/errors).\n\n## Authentication\n\nUse `FOURA_API_KEY` in stdio mode or an `Authorization: Bearer pk_live_...` header with the hosted endpoint. One key authenticates all four tools.\n\nKeys are managed in the [dashboard](https://foura.ai/dashboard/#api-keys), where you can create, reveal, rotate, or deactivate them. See [foura.ai/docs/getting-started/authentication](https://foura.ai/docs/getting-started/authentication) for the full key-management walkthrough.\n\n## Error envelope - typed contract for agent retries\n\nEvery error (`isError: true`) carries a `structuredContent` envelope with at minimum these three fields:\n\n```jsonc\n{\n  \"service\": \"auto\" | \"single\" | \"proxy\" | \"browser\",\n  \"code\": \"ssrf_blocked\" | \"auth_failed\" | \"rate_limited\" | ...,\n  \"error\": \"Human-readable message\"\n}\n```\n\nWhere the upstream returned a status, you also get `status` (HTTP code) and on rate-limit / capacity errors the FourA API envelope adds `retryAfter`, `current.{concurrency, rpm}`, `limits.{maxConcurrency, maxRpm}`.\n\n| `code` | When | Retry safe? |\n|---|---|---|\n| `ssrf_blocked` | Target resolves to a private or reserved address | No - change the URL |\n| `upstream_non_json` | Upstream returned malformed body | Maybe - investigate |\n| `bad_request` (400) | Input shape rejected by FourA | No - fix arguments |\n| `auth_failed` (401) | Key missing, invalid, or deactivated | No - fix the key |\n| `forbidden` (403) | Authenticated but not allowed | No |\n| `not_found` (404) | Target / endpoint doesn't exist | No |\n| `rate_limited` (429) | RPM cap hit | Yes - wait `retryAfter` |\n| `at_capacity` (503) | Concurrency cap hit | Yes - wait `retryAfter` |\n| `service_disabled` (503) | Maintenance window | Yes - wait `retryAfter` |\n| `service_unavailable` (503) | Generic 503 | Yes - short backoff |\n| `upstream_error` (`>=500`) | Upstream 5xx | Yes - exponential backoff |\n| `upstream_client_error` (4xx) | Other 4xx | Usually no |\n| `no_eligible_proxy` | No proxy matches the requested `exitCountries` | No - change the country scope |\n| `plan_limit_*` (403/429) | Your own FourA plan refused the call, not the target | Only `retryAfter` clears it - see below |\n\nA `plan_limit_` code names which of your plan's limits refused the call: `credits`, `bandwidth`, `rate`, `concurrency`, `browser_daily`, `premium`, or `feature`. It is not the target blocking you, so retrying the same work through another tool spends the rest of the allowance for nothing. Wait out `retryAfter` where there is one, or change the plan.\n\nLLM agents can read `code` directly for retry logic without parsing prose. Spec reference: [foura.ai/docs/api/errors](https://foura.ai/docs/api/errors).\n\n### What every result carries\n\nBeside the tool's own fields, each result reports what the call cost and how to trace it:\n\n- `credits` - credits this call spent, on failures as well, because the work was done either way;\n- `request_id` - FourA's id for the call. Quote it in a support request;\n- `exitClass` - `premium` when a premium exit served the call. On `foura_single` and `foura_browser` that happens when `proxy` replays an exit `foura_proxy` found.\n\n## Combining the tools - reuse the same exit\n\nThe lower-level tools compose. `foura_proxy` returns the base36 ID of the exit it used. Pass that ID into `foura_single.proxy` or `foura_browser.proxy` to reuse the same exit for the next request.\n\n```jsonc\n// 1. Find a working exit. Difficult protected targets may need maxTries:25-30.\nconst r = await foura_proxy({\n  maxTries: 30,\n  request: { method: \"GET\", url: \"https://probe.example.com\" }\n});\n// Returns { status: 200, proxy: \"4DZ3VE\", ... }\n\n// 2. Reuse it for follow-up HTTP\nawait foura_single({ method: \"GET\", url: \"https://target/api\", proxy: r.proxy });\n\n// 3. Or render JavaScript through the same exit.\nawait foura_browser({ url: \"https://target/spa\", proxy: r.proxy });\n```\n\nFor a protected JavaScript page, find a working route with `foura_proxy` before calling `foura_browser`. Starting in the browser can return the challenge page before the real content loads.\n\nTo choose a different proxy on the next `foura_proxy` call, pass the previous ID as `ignoreProxies: [\"4DZ3VE\"]`. The `proxy` field on `foura_single` and `foura_browser` also accepts raw URLs (`http://host:port`, `socks5://...`) if you have your own list.\n\n## Large responses - `offload_large` (default: inline)\n\nBy default (since v0.2.0), full response bodies are returned inline in `structuredContent` regardless of size. This works in every MCP client.\n\nIf your client supports MCP `resources/read` (and you want to save tokens on big pages), pass `offload_large: true` per tool call. Responses of 50 KB or more are returned as a `resource_link`, and your client fetches the body only when it needs it. The resource remains available for one hour.\n\n```jsonc\n{\n  \"method\": \"GET\",\n  \"url\": \"https://en.wikipedia.org/wiki/Web_scraping\",\n  \"offload_large\": true   // opt in for token savings\n}\n```\n\nSupport for MCP resource links varies by client. Leave `offload_large` at its default `false` if your client can't read `resource_link` blocks.\n\nOnly the API key that created an offloaded resource can read it back.\n\n## Limits and responsible use\n\n- **Private targets are refused.** Requests to private or reserved addresses are blocked at the MCP layer. Only public-internet hosts are forwarded.\n- **Rate limits** are enforced by the FourA API per service. Concurrency + RPM. Details at [foura.ai/docs/api/rate-limits](https://foura.ai/docs/api/rate-limits).\n\nUse FourA only for public content you are authorized to access and in accordance with the target site's terms and applicable law.\n\n## Run it yourself\n\nRun the stdio server directly from npm with `npx -y @fouradata/mcp`, or build the included [`Dockerfile`](./Dockerfile) for the Streamable HTTP transport.\n\nConfigurable environment:\n\n| Variable | Default | Purpose |\n|---|---|---|\n| `PORT` | `3076` | HTTP listen port |\n| `FOURA_API_BASE` | `https://api.foura.ai/api` | Upstream FourA REST base URL |\n| `FOURA_MCP_PAYLOADS_DIR` | `/data/payloads` | Where responses of 50 KB or more are cached on disk |\n\nSee [DEVELOPMENT.md](./DEVELOPMENT.md) for the local build and test workflow.\n\n## License\n\nMIT. See [`LICENSE`](./LICENSE).\n\n## Links\n\n- FourA (web scraping API): <https://foura.ai>\n- MCP server page: <https://foura.ai/mcp>\n- Source (GitHub): <https://github.com/fouradata/mcp>\n- npm package: <https://www.npmjs.com/package/@fouradata/mcp>\n- API documentation: <https://foura.ai/docs>\n- MCP server reference: <https://foura.ai/docs/mcp/server>\n- MCP error codes: <https://foura.ai/docs/mcp/errors>\n- MCP recipes: <https://foura.ai/docs/mcp/recipes>\n- REST API errors: <https://foura.ai/docs/api/errors>\n- MCP specification: <https://modelcontextprotocol.io>\n- Get a key: <https://foura.ai/dashboard/#api-keys>\n","readmeFilename":"README.md"}