{"_id":"@veniceai/mcp-server","_rev":"8-b03e6b0d9dd7213a10802ae47cb2cb03","name":"@veniceai/mcp-server","dist-tags":{"alpha":"0.1.2-alpha","latest":"0.3.2"},"versions":{"0.1.0-alpha":{"name":"@veniceai/mcp-server","version":"0.1.0-alpha","keywords":["mcp","model-context-protocol","venice","ai","uncensored","x402","llm","image-generation","claude","cursor"],"author":{"name":"Venice AI"},"license":"MIT","_id":"@veniceai/mcp-server@0.1.0-alpha","maintainers":[{"name":"timvenice","email":"tim@venice.ai"}],"homepage":"https://venice.ai","bugs":{"url":"https://github.com/veniceai/venice-mcp-server/issues"},"bin":{"venice-mcp":"dist/cli.js"},"dist":{"shasum":"a99904a5dc172e61c265ba4a1dd68ae039c644d4","tarball":"https://registry.npmjs.org/@veniceai/mcp-server/-/mcp-server-0.1.0-alpha.tgz","fileCount":57,"integrity":"sha512-XyP1ho+gwC7E7N3IQRIcsXBbOfI5+3ZinYCpe2IhL5ab/MkHSgvNRdIK2H/HMpb37FB7oi+QAEVWYdynqJMtig==","signatures":[{"sig":"MEUCIQDw0flGVuw9oFsHtzBzeEDppXv/O6j7Nd/uMzn/w6WFEAIgBPy7SsZVH0hdxVp6A5bmTmXeIBevkbCaqUSzNLPy9ec=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187398},"main":"./dist/server.js","type":"module","types":"./dist/server.d.ts","module":"./dist/server.js","engines":{"node":">=18"},"gitHead":"87c3551194d785030b0b3757dfe435adf304f153","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"tsc --noEmit","test":"tsx --test test/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/cli.js","start":"node dist/cli.js","test:e2e":"npm run build && tsx test/e2e/run.ts","test:unit":"tsx --test test/config.test.ts test/format.test.ts test/venice-client.test.ts test/tools.test.ts","start:http":"node dist/cli.js --http","test:e2e:safe":"VENICE_E2E_PHASE=full npm run test:e2e","prepublishOnly":"npm run build","test:e2e:empty":"VENICE_E2E_PHASE=empty npm run test:e2e","test:e2e:topup":"VENICE_E2E_PHASE=topup npm run test:e2e","test:e2e:create":"VENICE_E2E_PHASE=create npm run test:e2e","test:e2e:funded":"VENICE_E2E_PHASE=funded npm run test:e2e","test:e2e:balance":"VENICE_E2E_PHASE=balance npm run test:e2e","test:integration":"tsx --test test/integration.test.ts","test:e2e:all-tools":"npm run build && tsx test/e2e/test-all-tools.ts","test:e2e:all-tools:x402":"npm run build && tsx test/e2e/test-all-tools.ts x402","test:e2e:all-tools:apikey":"npm run build && tsx test/e2e/test-all-tools.ts apikey"},"_npmUser":{"name":"timvenice","email":"tim@venice.ai"},"repository":{"url":"git+https://github.com/veniceai/venice-mcp-server.git","type":"git"},"_npmVersion":"11.2.0","description":"Model Context Protocol server for Venice.ai — uncensored, private, crypto-native AI inference for Claude, ChatGPT, Cursor and any MCP host. Community-maintained. Provided as-is, with no warranty or SLA from Venice AI. Use at your own risk.","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^3.23.8","express":"^4.21.2","@modelcontextprotocol/sdk":"^1.0.4"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","viem":"^2.48.8","typescript":"^5.7.2","@types/node":"^22.10.2","@types/express":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-server_0.1.0-alpha_1778461682632_0.8563151358039593","host":"s3://npm-registry-packages-npm-production"}},"0.1.1-alpha":{"name":"@veniceai/mcp-server","version":"0.1.1-alpha","keywords":["mcp","model-context-protocol","venice","ai","uncensored","x402","llm","image-generation","claude","cursor"],"author":{"name":"Venice AI"},"license":"MIT","_id":"@veniceai/mcp-server@0.1.1-alpha","maintainers":[{"name":"timvenice","email":"tim@venice.ai"},{"name":"jp-at-venice","email":"jesse@venice.ai"}],"homepage":"https://venice.ai","bugs":{"url":"https://github.com/veniceai/venice-mcp-server/issues"},"bin":{"venice-mcp":"dist/cli.js"},"dist":{"shasum":"30001379854f47d0d3da66c59d4e71cbc025aed8","tarball":"https://registry.npmjs.org/@veniceai/mcp-server/-/mcp-server-0.1.1-alpha.tgz","fileCount":53,"integrity":"sha512-XFlLC5d8V46makokqBAYP4IEfehg3PDQ7YSR2PC/a+w2po4J04JpyYSwgQHUyc69YdY3vhC7wOVzjQdAubPyKg==","signatures":[{"sig":"MEQCIBL2BzDQiMJA/GOFEyMw04EfkHUOS3BGvFbkTUH0skHmAiBNRY2pQ2iVE5G0FfkPkP7JGGiGGkvgHrROMlSmQkWcGA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":206088},"main":"./dist/server.js","type":"module","types":"./dist/server.d.ts","module":"./dist/server.js","engines":{"node":">=18"},"gitHead":"16cfbacd662c4b6ae30de86de3db206be85698fd","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"tsc --noEmit","test":"tsx --test test/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/cli.js","start":"node dist/cli.js","test:e2e":"npm run build && tsx test/e2e/run.ts","test:unit":"tsx --test test/config.test.ts test/format.test.ts test/venice-client.test.ts test/tools.test.ts","start:http":"node dist/cli.js --http","test:e2e:safe":"VENICE_E2E_PHASE=full npm run test:e2e","prepublishOnly":"npm run build","test:e2e:empty":"VENICE_E2E_PHASE=empty npm run test:e2e","test:e2e:topup":"VENICE_E2E_PHASE=topup npm run test:e2e","test:e2e:create":"VENICE_E2E_PHASE=create npm run test:e2e","test:e2e:funded":"VENICE_E2E_PHASE=funded npm run test:e2e","test:e2e:balance":"VENICE_E2E_PHASE=balance npm run test:e2e","test:integration":"tsx --test test/integration.test.ts","test:e2e:all-tools":"npm run build && tsx test/e2e/test-all-tools.ts","test:e2e:all-tools:x402":"npm run build && tsx test/e2e/test-all-tools.ts x402","test:e2e:all-tools:apikey":"npm run build && tsx test/e2e/test-all-tools.ts apikey"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:111d5aba-11dc-4fd4-8672-5cff4d8205ac"}},"repository":{"url":"git+https://github.com/veniceai/venice-mcp-server.git","type":"git"},"_npmVersion":"11.11.0","description":"Model Context Protocol server for Venice.ai — uncensored, private, crypto-native AI inference for Claude, ChatGPT, Cursor and any MCP host. Community-maintained. Provided as-is, with no warranty or SLA from Venice AI. Use at your own risk.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"zod":"^3.23.8","express":"^4.21.2","@modelcontextprotocol/sdk":"^1.0.4"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"tsx":"^4.19.2","viem":"^2.48.8","typescript":"^5.7.2","@types/node":"^22.10.2","@types/express":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-server_0.1.1-alpha_1778547378286_0.8933666190596059","host":"s3://npm-registry-packages-npm-production"}},"0.1.2-alpha":{"name":"@veniceai/mcp-server","version":"0.1.2-alpha","keywords":["mcp","model-context-protocol","venice","ai","uncensored","x402","llm","image-generation","claude","cursor"],"author":{"name":"Venice AI"},"license":"MIT","_id":"@veniceai/mcp-server@0.1.2-alpha","maintainers":[{"name":"timvenice","email":"tim@venice.ai"},{"name":"jp-at-venice","email":"jesse@venice.ai"}],"homepage":"https://venice.ai","bugs":{"url":"https://github.com/veniceai/venice-mcp-server/issues"},"bin":{"venice-mcp":"dist/cli.js"},"dist":{"shasum":"a04739df7faf703c1e844925cb5b0f5a16aa207d","tarball":"https://registry.npmjs.org/@veniceai/mcp-server/-/mcp-server-0.1.2-alpha.tgz","fileCount":57,"integrity":"sha512-wdS815hNvSB6112/oLEgaKwKVDRbzxrFh4+ejPe79IplPeC/Ci0prYdDWNs/VAfdiwBUXM9zWOzboiRnQ1cIlQ==","signatures":[{"sig":"MEYCIQC5PqIeVkxVCHFeck/u7cZqs4Qe0F4CXWWSgsl8sFiudQIhANovPIoaG12NnJtezMWjdshPVruBeUYyv4OvDTf5SV4+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@veniceai%2fmcp-server@0.1.2-alpha","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":213117},"main":"./dist/server.js","type":"module","types":"./dist/server.d.ts","module":"./dist/server.js","engines":{"node":">=18"},"gitHead":"3685c8b97e1025a3c94074952f98d08bd236cee2","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"tsc --noEmit","test":"tsx --test test/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/cli.js","start":"node dist/cli.js","test:e2e":"npm run build && tsx test/e2e/run.ts","test:unit":"tsx --test test/config.test.ts test/format.test.ts test/venice-client.test.ts test/tools.test.ts","start:http":"node dist/cli.js --http","test:e2e:safe":"VENICE_E2E_PHASE=full npm run test:e2e","prepublishOnly":"npm run build","test:e2e:empty":"VENICE_E2E_PHASE=empty npm run test:e2e","test:e2e:topup":"VENICE_E2E_PHASE=topup npm run test:e2e","test:e2e:create":"VENICE_E2E_PHASE=create npm run test:e2e","test:e2e:funded":"VENICE_E2E_PHASE=funded npm run test:e2e","test:e2e:balance":"VENICE_E2E_PHASE=balance npm run test:e2e","test:integration":"tsx --test test/integration.test.ts","test:e2e:all-tools":"npm run build && tsx test/e2e/test-all-tools.ts","test:e2e:all-tools:x402":"npm run build && tsx test/e2e/test-all-tools.ts x402","test:e2e:all-tools:apikey":"npm run build && tsx test/e2e/test-all-tools.ts apikey"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:111d5aba-11dc-4fd4-8672-5cff4d8205ac"}},"repository":{"url":"git+https://github.com/veniceai/venice-mcp-server.git","type":"git"},"_npmVersion":"11.12.1","description":"Model Context Protocol server for Venice.ai — uncensored, private, crypto-native AI inference for Claude, ChatGPT, Cursor and any MCP host. Community-maintained. Provided as-is, with no warranty or SLA from Venice AI. Use at your own risk.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"zod":"^3.23.8","express":"^4.21.2","@modelcontextprotocol/sdk":"^1.0.4"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"tsx":"^4.19.2","viem":"^2.48.8","typescript":"^5.7.2","@types/node":"^22.10.2","@types/express":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-server_0.1.2-alpha_1778872921383_0.7791625089861005","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@veniceai/mcp-server","version":"0.2.0","keywords":["mcp","model-context-protocol","venice","ai","uncensored","x402","llm","image-generation","claude","cursor"],"author":{"name":"Venice AI"},"license":"MIT","_id":"@veniceai/mcp-server@0.2.0","maintainers":[{"name":"timvenice","email":"tim@venice.ai"},{"name":"jp-at-venice","email":"jesse@venice.ai"}],"homepage":"https://venice.ai","bugs":{"url":"https://github.com/veniceai/venice-mcp-server/issues"},"bin":{"venice-mcp":"dist/cli.js"},"dist":{"shasum":"ae2250a5dfee5d128127c39298b8047ebc003e45","tarball":"https://registry.npmjs.org/@veniceai/mcp-server/-/mcp-server-0.2.0.tgz","fileCount":57,"integrity":"sha512-EQvudBtf5KkPHd0bXtGPJE8/ixIwyG/jsomae9JrxE1nflbVWtL7mXUZmQHZ3xlMH3klb8HB/JGKTClvO1E6HA==","signatures":[{"sig":"MEQCIBhAzs38WN2lKPHpeBhLtRPQXeKCIk5muOjEgpOCUnI/AiBK15gHQb8ry0JHUWNDLqbioaZXPM38eKZ3rvDfdQBxfw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@veniceai%2fmcp-server@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":213157},"main":"./dist/server.js","type":"module","types":"./dist/server.d.ts","module":"./dist/server.js","engines":{"node":">=18"},"gitHead":"a9385d8a0216287e53e36cd41f4fd92ee0df169f","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"tsc --noEmit","test":"tsx --test test/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/cli.js","start":"node dist/cli.js","test:e2e":"npm run build && tsx test/e2e/run.ts","test:unit":"tsx --test test/config.test.ts test/format.test.ts test/venice-client.test.ts test/tools.test.ts","start:http":"node dist/cli.js --http","test:e2e:safe":"VENICE_E2E_PHASE=full npm run test:e2e","prepublishOnly":"npm run build","test:e2e:empty":"VENICE_E2E_PHASE=empty npm run test:e2e","test:e2e:topup":"VENICE_E2E_PHASE=topup npm run test:e2e","test:e2e:create":"VENICE_E2E_PHASE=create npm run test:e2e","test:e2e:funded":"VENICE_E2E_PHASE=funded npm run test:e2e","test:e2e:balance":"VENICE_E2E_PHASE=balance npm run test:e2e","test:integration":"tsx --test test/integration.test.ts","test:e2e:all-tools":"npm run build && tsx test/e2e/test-all-tools.ts","test:e2e:all-tools:x402":"npm run build && tsx test/e2e/test-all-tools.ts x402","test:e2e:all-tools:apikey":"npm run build && tsx test/e2e/test-all-tools.ts apikey"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:111d5aba-11dc-4fd4-8672-5cff4d8205ac"}},"repository":{"url":"git+https://github.com/veniceai/venice-mcp-server.git","type":"git"},"_npmVersion":"11.12.1","description":"Model Context Protocol server for Venice.ai — uncensored, private, crypto-native AI inference for Claude, ChatGPT, Cursor and any MCP host. Community-maintained. Provided as-is, with no warranty or SLA from Venice AI. Use at your own risk.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"zod":"^3.23.8","express":"^4.21.2","@modelcontextprotocol/sdk":"^1.0.4"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","viem":"^2.48.8","typescript":"^5.7.2","@types/node":"^22.10.2","@types/express":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-server_0.2.0_1778971860832_0.08941965926736017","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@veniceai/mcp-server","version":"0.3.0","keywords":["mcp","model-context-protocol","venice","ai","uncensored","x402","llm","image-generation","claude","cursor"],"author":{"name":"Venice AI"},"license":"MIT","_id":"@veniceai/mcp-server@0.3.0","maintainers":[{"name":"timvenice","email":"tim@venice.ai"},{"name":"jp-at-venice","email":"jesse@venice.ai"}],"homepage":"https://venice.ai","bugs":{"url":"https://github.com/veniceai/venice-mcp-server/issues"},"bin":{"venice-mcp":"dist/cli.js"},"dist":{"shasum":"6879c2282324e2a0f72b4cda7389771009e2c240","tarball":"https://registry.npmjs.org/@veniceai/mcp-server/-/mcp-server-0.3.0.tgz","fileCount":61,"integrity":"sha512-zF/41cFgwAJFRrR45Yh5KRkEFMQmdqtoJ08ZBenbgqfhZ2de+m21kcfxlSKUa3IA4sTtGt0jdm4PSnePbVjziQ==","signatures":[{"sig":"MEQCIEfWnfarjWp+rHnE/FDWBlkCQXS0k6ZPlbO2+/+vfmkMAiA2RwkwILCFIcwt3x3UZ8ABIwnCAyE1z8BiNBcWOTkCIg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEHi4ANH7+z2h3rFDtiAswkiG7KdAZFBrtTq6LMTT1VBAiAcfIbUi0yVucJsL2rNCvusjOElAl55WRUSU/U3pWUsuw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@veniceai%2fmcp-server@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":440764},"main":"./dist/server.js","type":"module","types":"./dist/server.d.ts","module":"./dist/server.js","engines":{"node":">=18"},"gitHead":"e995a387650c63b60277970cb1dfe653ed7e2507","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"tsc --noEmit","test":"npm run build && tsx --test test/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/cli.js","start":"node dist/cli.js","test:e2e":"npm run build && tsx test/e2e/run.ts","test:unit":"tsx --test test/config.test.ts test/format.test.ts test/venice-client.test.ts test/tools.test.ts","start:http":"node dist/cli.js --http","test:e2e:safe":"VENICE_E2E_PHASE=full npm run test:e2e","prepublishOnly":"npm run build","test:e2e:empty":"VENICE_E2E_PHASE=empty npm run test:e2e","test:e2e:topup":"VENICE_E2E_PHASE=topup npm run test:e2e","test:e2e:create":"VENICE_E2E_PHASE=create npm run test:e2e","test:e2e:funded":"VENICE_E2E_PHASE=funded npm run test:e2e","test:e2e:balance":"VENICE_E2E_PHASE=balance npm run test:e2e","test:integration":"npm run build && tsx --test test/integration.test.ts","test:e2e:all-tools":"npm run build && tsx test/e2e/test-all-tools.ts","test:e2e:all-tools:x402":"npm run build && tsx test/e2e/test-all-tools.ts x402","test:e2e:all-tools:apikey":"npm run build && tsx test/e2e/test-all-tools.ts apikey"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"111d5aba-11dc-4fd4-8672-5cff4d8205ac"}},"repository":{"url":"git+https://github.com/veniceai/venice-mcp-server.git","type":"git"},"_npmVersion":"11.19.0","description":"Model Context Protocol server for Venice.ai — uncensored, private, crypto-native AI inference for Claude, ChatGPT, Cursor and any MCP host. Community-maintained. Provided as-is, with no warranty or SLA from Venice AI. Use at your own risk.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"zod":"^3.23.8","express":"^4.21.2","@modelcontextprotocol/sdk":"^1.0.4"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","viem":"^2.48.8","typescript":"^5.7.2","@types/node":"^22.10.2","@types/express":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-server_0.3.0_1792107300729_0.737791240744939","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@veniceai/mcp-server","version":"0.3.1","keywords":["mcp","model-context-protocol","venice","ai","uncensored","x402","llm","image-generation","claude","cursor"],"author":{"name":"Venice AI"},"license":"MIT","_id":"@veniceai/mcp-server@0.3.1","maintainers":[{"name":"timvenice","email":"tim@venice.ai"},{"name":"jp-at-venice","email":"jesse@venice.ai"}],"homepage":"https://venice.ai","bugs":{"url":"https://github.com/veniceai/venice-mcp-server/issues"},"bin":{"venice-mcp":"dist/cli.js"},"dist":{"shasum":"26b17d7de86b0d3a5633abb3d963f4e8d3b498cd","tarball":"https://registry.npmjs.org/@veniceai/mcp-server/-/mcp-server-0.3.1.tgz","fileCount":3693,"integrity":"sha512-v/hz7vg3H+ySwDu4WeigzDa0R2iuc++Yb18YfuEH1NU0pBQllMqn2dKW3n76d/3CQFN0tOi6GhjW2LBVrLzsHA==","signatures":[{"sig":"MEQCIA/M0gwJHmceKQ+loaz8TJDw1xdhbjxDAiZWwum9Y7l6AiBfR737OblpmIc3aSvw590HBV641m/J/jqTdDxSmzOXUw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDuKOD6RltC63P8SuuVUUV/QcvNfN/K5yPa6hQMEhsOLQIgSl73YdlgEvlulvFo0rNh4+YD6hNdhILLsaNnHD6BeSs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@veniceai%2fmcp-server@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":16776434},"main":"./dist/server.js","type":"module","_from":"file:/home/runner/work/_temp/npm-release/release.tgz","types":"./dist/server.d.ts","module":"./dist/server.js","engines":{"node":">=20"},"scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"tsc --noEmit","test":"npm run build && tsx --test test/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/cli.js","start":"node dist/cli.js","test:e2e":"npm run build && tsx test/e2e/run.ts","test:unit":"tsx --test test/config.test.ts test/format.test.ts test/venice-client.test.ts test/tools.test.ts","start:http":"node dist/cli.js --http","test:e2e:safe":"VENICE_E2E_PHASE=full npm run test:e2e","prepublishOnly":"npm run build","test:e2e:empty":"VENICE_E2E_PHASE=empty npm run test:e2e","test:e2e:topup":"VENICE_E2E_PHASE=topup npm run test:e2e","test:e2e:create":"VENICE_E2E_PHASE=create npm run test:e2e","test:e2e:funded":"VENICE_E2E_PHASE=funded npm run test:e2e","test:e2e:balance":"VENICE_E2E_PHASE=balance npm run test:e2e","test:integration":"npm run build && tsx --test test/integration.test.ts","test:e2e:all-tools":"npm run build && tsx test/e2e/test-all-tools.ts","test:e2e:all-tools:x402":"npm run build && tsx test/e2e/test-all-tools.ts x402","test:e2e:all-tools:apikey":"npm run build && tsx test/e2e/test-all-tools.ts apikey"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"111d5aba-11dc-4fd4-8672-5cff4d8205ac"}},"_resolved":"/home/runner/work/_temp/npm-release/release.tgz","_integrity":"sha512-v/hz7vg3H+ySwDu4WeigzDa0R2iuc++Yb18YfuEH1NU0pBQllMqn2dKW3n76d/3CQFN0tOi6GhjW2LBVrLzsHA==","repository":{"url":"git+https://github.com/veniceai/venice-mcp-server.git","type":"git"},"_npmVersion":"11.19.1","description":"Model Context Protocol server for Venice AI — uncensored, private, crypto-native AI inference for Claude, ChatGPT, Cursor and any MCP host. Maintained by Venice AI.","directories":{},"_nodeVersion":"24.22.2","dependencies":{"zod":"^3.25.28","express":"^4.22.3","@modelcontextprotocol/sdk":"^1.32.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.15","viem":"^2.57.4","typescript":"^5.7.2","@types/node":"^22.10.2","@types/express":"^5.0.0"},"bundleDependencies":["@modelcontextprotocol/sdk","express","zod"],"_npmOperationalInternal":{"tmp":"tmp/mcp-server_0.3.1_1793826367648_0.7364869458055023","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"_id":"@veniceai/mcp-server@0.3.2","bin":{"venice-mcp":"dist/cli.js"},"bugs":{"url":"https://github.com/veniceai/venice-mcp-server/issues"},"dist":{"shasum":"632e7195096c46de9ef1e6a192319a2c32583cf7","tarball":"https://registry.npmjs.org/@veniceai/mcp-server/-/mcp-server-0.3.2.tgz","fileCount":3693,"integrity":"sha512-n/sOx8wHyl6TDAGHVejddgyXn+ax04GhsYWaC1L0aImImDQK4p21Ud0Cwom9rJiUVDoI3efqBSRh8HwY3wgZ8w==","signatures":[{"sig":"MEUCIQDxVJfaNblGW8y1Sy6SqU7oN1TweeAFZz1m9txZjNftygIgCjwKBmsLcJCYw9H3nOv4vgOAOa0wS4K5JfphL/QCqsM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGReRdxTxWcloIa7LTuMuzmp90jOWpwPWLW3BMxFYtziAiEAkIxn1sKxIEVpa+1YWUk2MU+Bp5m4LE3niMyS32nPXrY="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@veniceai%2fmcp-server@0.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":16810423},"main":"./dist/server.js","name":"@veniceai/mcp-server","type":"module","_from":"file:/home/runner/work/_temp/npm-release/release.tgz","types":"./dist/server.d.ts","author":{"name":"Venice AI"},"module":"./dist/server.js","engines":{"node":">=20"},"license":"MIT","mcpName":"io.github.veniceai/venice-mcp-server","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"tsc --noEmit","test":"npm run build && tsx --test test/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/cli.js","start":"node dist/cli.js","test:e2e":"npm run build && tsx test/e2e/run.ts","test:unit":"tsx --test test/config.test.ts test/format.test.ts test/venice-client.test.ts test/tools.test.ts","start:http":"node dist/cli.js --http","test:e2e:safe":"VENICE_E2E_PHASE=full npm run test:e2e","prepublishOnly":"npm run build","test:e2e:empty":"VENICE_E2E_PHASE=empty npm run test:e2e","test:e2e:topup":"VENICE_E2E_PHASE=topup npm run test:e2e","test:e2e:create":"VENICE_E2E_PHASE=create npm run test:e2e","test:e2e:funded":"VENICE_E2E_PHASE=funded npm run test:e2e","test:e2e:balance":"VENICE_E2E_PHASE=balance npm run test:e2e","test:integration":"npm run build && tsx --test test/integration.test.ts","test:e2e:all-tools":"npm run build && tsx test/e2e/test-all-tools.ts","test:e2e:all-tools:x402":"npm run build && tsx test/e2e/test-all-tools.ts x402","test:e2e:all-tools:apikey":"npm run build && tsx test/e2e/test-all-tools.ts apikey"},"version":"0.3.2","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"111d5aba-11dc-4fd4-8672-5cff4d8205ac"}},"homepage":"https://venice.ai","keywords":["mcp","model-context-protocol","venice","ai","uncensored","x402","llm","image-generation","claude","cursor"],"_resolved":"/home/runner/work/_temp/npm-release/release.tgz","_integrity":"sha512-n/sOx8wHyl6TDAGHVejddgyXn+ax04GhsYWaC1L0aImImDQK4p21Ud0Cwom9rJiUVDoI3efqBSRh8HwY3wgZ8w==","repository":{"url":"git+https://github.com/veniceai/venice-mcp-server.git","type":"git"},"_npmVersion":"11.19.1","description":"Model Context Protocol server for Venice AI — uncensored, private, crypto-native AI inference for Claude, ChatGPT, Cursor and any MCP host. Maintained by Venice AI.","directories":{},"maintainers":[{"name":"timvenice","email":"tim@venice.ai"},{"name":"jp-at-venice","email":"jesse@venice.ai"}],"_nodeVersion":"24.22.2","dependencies":{"zod":"^3.25.28","express":"^4.22.3","@modelcontextprotocol/sdk":"^1.32.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.15","viem":"^2.57.4","typescript":"^5.7.2","@types/node":"^22.10.2","@types/express":"^5.0.0"},"bundleDependencies":["@modelcontextprotocol/sdk","express","zod"],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-server_0.3.2_1794343553379_0.3608172800990511"}}},"time":{"created":"2026-05-11T01:08:02.527Z","modified":"2026-11-10T20:45:54.026Z","0.1.0-alpha":"2026-05-11T01:08:02.793Z","0.1.1-alpha":"2026-05-12T00:56:18.442Z","0.1.2-alpha":"2026-05-15T19:22:01.545Z","0.2.0":"2026-05-16T22:51:00.976Z","0.3.0":"2026-10-15T23:35:00.935Z","0.3.1":"2026-11-04T21:06:07.866Z","0.3.2":"2026-11-10T20:45:53.630Z"},"bugs":{"url":"https://github.com/veniceai/venice-mcp-server/issues"},"author":{"name":"Venice AI"},"license":"MIT","homepage":"https://venice.ai","keywords":["mcp","model-context-protocol","venice","ai","uncensored","x402","llm","image-generation","claude","cursor"],"repository":{"url":"git+https://github.com/veniceai/venice-mcp-server.git","type":"git"},"description":"Model Context Protocol server for Venice AI — uncensored, private, crypto-native AI inference for Claude, ChatGPT, Cursor and any MCP host. Maintained by Venice AI.","maintainers":[{"name":"timvenice","email":"tim@venice.ai"},{"name":"jp-at-venice","email":"jesse@venice.ai"}],"readme":"# @veniceai/mcp-server\n\n> Model Context Protocol server for the **Venice API** - uncensored, private AI for any MCP host (Claude Desktop, Cursor, ChatGPT, LM Studio, Continue, LibreChat, Open WebUI, AnythingLLM, Jan, Le Chat).\n\n[![npm](https://img.shields.io/npm/v/@veniceai/mcp-server.svg)](https://www.npmjs.com/package/@veniceai/mcp-server)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\nPlug Venice's chat, image, video, audio, music, and character models into any agent in 30 seconds, including billing and API-key operations. **45 tools across all modalities, one config block.**\n\nRequires Node.js 20 or newer; Node.js 22 or 24 is recommended. CI tests Node.js 20, 22, and 24. The refreshed MCP SDK dependency graph requires Node.js 20 for fresh installs, so upgrade Node.js before installing this version if you previously used Node.js 18.\n\n## Quick start\n\n### 1. Get a key from [venice.ai](https://venice.ai)\n\nSee the [API key guide](https://docs.venice.ai/guides/getting-started/generating-api-key) for step-by-step instructions.\n\n### 2. Add this to your MCP host config\n\n**Claude Desktop** (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS, `%APPDATA%\\Claude\\claude_desktop_config.json` on Windows), **Cursor** (`~/.cursor/mcp.json`), **LM Studio**, etc:\n\n```json\n{\n  \"mcpServers\": {\n    \"venice\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@veniceai/mcp-server@0.3.2\"],\n      \"env\": { \"VENICE_API_KEY\": \"<your-venice-api-key>\" }\n    }\n  }\n}\n```\n\n### 3. Restart your MCP host\n\nThat's it. Type a prompt — your agent now has chat, image, video, music, TTS, ASR, and 39 more Venice tools.\n\n\n## What you get\n\n**45 tools** spanning every Venice modality plus billing and API-key operations, **3 resources** (`venice://models`, `venice://styles`, `venice://voices`) and **9 prompt templates**: uncensored research, NSFW creative writing and an image style explorer, plus six creator workflows (create image, create video, create audio, YouTube thumbnail, product photoshoot and explainer video) that walk the agent from a brief to a finished result, quoting paid video and music jobs first. Hosts such as Claude Code show them as slash commands, for example `/mcp__venice__create-video`. `VENICE_DISABLE_NSFW=1` hides the first two. The voices resource is built live from each TTS model's catalog metadata.\n\nEvery tool declares explicit `readOnlyHint`, `destructiveHint`, `idempotentHint` and `openWorldHint` annotations to help hosts decide when to request approval. Video and music status tools are marked destructive because their optional `delete_media_on_completion` argument can delete stored media before returning the result. Hints describe a tool's possible behavior; hosts should still enforce their own approval policy.\n\n### 💬 Chat & embeddings\n\n| Tool | Description |\n|---|---|\n| `venice_chat` | Chat completions with documented text/image/audio/video/file blocks, structured response formats, function tools, prompt caching, and reasoning controls. Calls are plaintext and non-streaming. |\n| `venice_responses` | Alpha, stateless Responses API for text models. Supports text/image input and reasoning controls. E2EE-capable models are not supported, and this tool does not expose unreliable tool fields. |\n| `venice_embeddings` | Compute embeddings for text input (OpenAI-compatible). |\n| `venice_chat_with_character` | Chat with a Venice character by slug. |\n\n### 🎨 Image\n\n| Tool | Description |\n|---|---|\n| `venice_image_generate` | Generate an image. Supports model-specific width/height or free-string `aspect_ratio`/`resolution`, quality tiers, prompt enhancement, style references, web search, variants, and output format. |\n| `venice_image_edit` | Edit an image with a prompt. Supports free-string sizing, output format, and prompt enhancement; returns a base64 image. |\n| `venice_image_multi_edit` | Edit multiple images together with a single prompt (multi-image composition / outpainting), including free-string sizing, quality, output format, and prompt enhancement. |\n| `venice_image_upscale` | Upscale an image (2–4× scale, with a `creativity` control). Returns base64 PNG. |\n| `venice_image_remove_bg` | Remove image background; returns a transparent PNG. |\n| `venice_image_styles` | List image style presets available for `venice_image_generate`. |\n\n### 🎬 Video\n\n| Tool | Description |\n|---|---|\n| `venice_video_generate` | Queue a video generation. Supports Veo 3.1, Kling, Wan, Seedance (incl. reference-to-video), MiniMax, PixVerse, Runway, LTX, Grok Imagine, and others. Accepts image, video, audio, reference inputs, and the Seedance consent attestation flow where applicable. |\n| `venice_video_status` | Check status of a queued video job. Returns JSON progress while `PROCESSING`, then either an embedded MP4 or a `download_url` resource link. Pass the queue-time `download_url` for VPS / Grok Imagine Private models. |\n| `venice_video_complete` | Mark a completed video as downloaded. Reports server-side deletion only when Venice confirms success. |\n| `venice_video_quote` | Get a price quote for a video generation BEFORE queuing. |\n\n### 🔊 Audio (TTS / ASR)\n\n| Tool | Description |\n|---|---|\n| `venice_tts` | Convert text to speech. Supports cloned voices, temperature, and Venice's streaming flag; MCP returns the completed audio as one buffered result. |\n| `venice_asr` | Transcribe audio from a URL as JSON or text, with optional word and character timestamps. |\n| `venice_voice_clone` | Discover live model-scoped voice metadata, or clone a voice from a sample audio URL for `tts-chatterbox-hd` (default) or `tts-minimax-speech-02-hd`. Cloned voices are returned as a `vv_<id>` handle to pass as the `venice_tts` voice. |\n| `venice_audio_quote` | Get a price quote for music generation BEFORE queuing. |\n\n### 🎵 Music\n\n| Tool | Description |\n|---|---|\n| `venice_music_generate` | Queue music generation. Uses the live QueueAudioRequest fields: `force_instrumental`, `lyrics_prompt`, `lyrics_optimizer`, `loop`, `voice`, `language_code`, `speed`, and model-specific `duration_seconds`. Deprecated `instrumental` / `lyrics` are still accepted as aliases. |\n| `venice_music_status` | Check status of a queued music job. Returns JSON progress while `PROCESSING`, then either embedded audio or a `download_url` resource link. |\n| `venice_music_complete` | Mark a completed music job as downloaded and delete server-side media. |\n\n### 🌐 Web augment\n\n| Tool | Description |\n|---|---|\n| `venice_web_search` | Search with Brave (default, Zero Data Retention), Google (proxied/anonymized by Venice), or Exa (Zero Data Retention). Returns the parsed `{ query, results }` as structured content. |\n| `venice_web_scrape` | Scrape one URL into markdown text. |\n| `venice_text_parser` | Extract text from a document URL (PDF, DOCX, EPUB, PPTX, XLSX, …). |\n\n### 📚 Catalog\n\n| Tool | Description |\n|---|---|\n| `venice_list_models` | Page through the live model catalog, every type by default, with server-side filtering for `asr`, `decision`, `embedding`, `image`, `music`, `text`, `tts`, `upscale`, `inpaint`, `video`, `all`, `code`, or any newer catalog type. Returns compact summaries (50 per page by default, up to 200) with `total`, `next_offset`, and every matching model id; set `verbose` for full model objects. |\n| `venice_model_details` | Get one exact model's full catalog row, including `model_spec` constraints, capabilities, and pricing. |\n| `venice_model_traits` | Get the live trait-name to model-id mapping for a model type. |\n| `venice_model_compatibility_mapping` | Get compatible model-name to Venice model-id mappings. |\n| `venice_list_characters` | List public Venice characters with search, tag/category/model, content, capability, sort, and pagination filters. API key only. |\n| `venice_get_character` | Get a public character by slug. API key only. |\n| `venice_character_reviews` | List paginated public reviews for a character. API key only. |\n\n### 🔐 TEE attestation\n\n| Tool | Description |\n|---|---|\n| `venice_tee_attestation` | Fetch Intel TDX attestation evidence, optional NVIDIA evidence, and the model signing key using a caller-generated 32-byte nonce. |\n| `venice_tee_signature` | Fetch the enclave response-signature payload for a chat completion request ID. |\n\nBoth routes are currently live without authentication. They only apply to text models advertising `supportsTeeAttestation`. These tools expose evidence; they do not verify it, and this server does not encrypt chat. `venice_chat` rejects `enable_e2ee`.\n\nBoth chat tools retain the upstream completion `id` and actual `model`, when present, in `structuredContent`. Only responses with the upstream `X-Venice-TEE: true` header also include those values in an additional JSON text block for text-only clients. Pass those values to `venice_tee_signature` to retrieve the signature for that completion. Ordinary responses keep their existing answer text without an extra metadata block; the first block and tool-call fallbacks are unchanged. The header is an upstream indication, not cryptographic verification.\n\n### Media API behavior\n\n- Successful upstream responses have a default 16 MiB limit, including JSON and text without a declared Content-Length. Tool-specific image, video, audio, transcription, billing, and RPC limits take precedence. Oversized responses fail without a partial result; an inference may already have completed and incurred a charge before the limit is reached. There is no environment override for this default.\n- Inline uploads for image upscale, ASR, voice cloning, and document parsing should include a concrete MIME type, for example `data:application/pdf;base64,...`. Base64 and percent-encoded payloads preserve the original bytes; malformed base64 is rejected before upload. When the type is omitted or `application/octet-stream`, the server infers PDF, PNG, JPEG, GIF, WebP, WAV, or FLAC from the file signature and supplies a matching filename extension. Other formats require an explicit type; for DOCX use `application/vnd.openxmlformats-officedocument.wordprocessingml.document`, for MP3 use `audio/mpeg`, for M4A use `audio/mp4`, and for Ogg audio use `audio/ogg`. Shared container signatures and audio tags do not uniquely identify these formats, so these inputs are rejected locally until a concrete type is supplied.\n- `venice_embeddings` accepts at most 128 texts per call, for both float and base64 output. Larger batches are rejected locally before submission, so the rejected batch incurs no upstream charge. Split larger jobs into separate calls; the server never automatically splits or retries a batch. This conservative limit avoids the observed overflow for a 256-text, 4,096-dimension float response, but is not a byte-size guarantee for every model or response encoding. The 16 MiB guard still applies, and an unusually large response from an accepted batch can still be rejected after processing upstream.\n- Upstream API redirects are rejected to keep credentials and request bodies at the configured API origin.\n- Image `aspect_ratio` and `resolution` values remain free strings because supported values vary by model. Venice validates them. When `enhance_prompt` is applied, image generate/edit/multi-edit results include the URL-decoded `enhanced_prompt` returned in `x-venice-enhanced-prompt`. Image responses are capped at `VENICE_MAX_IMAGE_RESPONSE_BYTES` (default 32 MiB). Unlike an oversized video, an oversized image result cannot be retried for free, so request fewer variants, a lower resolution, or jpeg/webp output for large batches.\n- Current public Seedance models may reject media containing detectable persons outright. Defensive support remains for compatible or legacy `needs_consent` responses: the tool returns Venice's policy text, affected media roles, and next step. The three `consents.seedance` flags are legal attestations and must only be set to `true` after the user explicitly confirms all three statements. Consent is never a content-policy bypass.\n- Completed videos may arrive as `video/mp4` or as JSON with a `download_url`. Binary completions are returned as an embedded MCP resource (`blob`, `mimeType: \"video/mp4\"`, synthetic `venice://video/...` URI), streamed into a bounded buffer that defaults to 25 MiB (`VENICE_MAX_VIDEO_RESPONSE_BYTES`). Oversized binary results remain queued and can be retried with the same queue ID after changing the limit. JSON completions return the `download_url` as an MCP resource link instead of fetching that URL. Because that link stops working once the stored media is removed, `delete_media_on_completion` is not applied to `download_url` results: download the file first, then call `venice_video_complete` (and optionally send an HTTP `DELETE` to the link to revoke it). For VPS / Grok Imagine Private models, `download_url` is returned only on queue; pass that URL into `venice_video_status` so a `COMPLETED` retrieve without an inline URL still yields a resource link.\n- Music retrieval returns JSON status and timing while processing, then an `audio/*` body when complete (including MP3, WAV, FLAC, and M4A). Completed tracks are returned as embedded MCP blob resources with a synthetic `venice://music/...` URI and buffered up to 32 MiB by default (`VENICE_MAX_AUDIO_RESPONSE_BYTES`). That configurable limit applies only to binary media; successful status JSON uses a separate fixed 1 MiB safety limit. Oversized, empty, or non-audio responses are not deleted, so the same queue ID remains available for cleanup or a retry with a higher limit. JSON completions with a `download_url` return it as an MCP resource link; as with video, `delete_media_on_completion` is not applied to them: download the file first, then call `venice_music_complete`.\n\n### ⛓️ Crypto\n\n| Tool | Description |\n|---|---|\n| `venice_crypto_networks` | List the live network slugs supported by the crypto RPC proxy. No authentication required. |\n| `venice_crypto_rpc` | Proxy one JSON-RPC request or a batch of up to 100 requests. Returns compact JSON (max 64 KiB) plus Venice's credit, cost, and idempotent-replay headers. Transaction broadcasts must be sent as single requests with `idempotency_key`. |\n\n### 💰 Billing (ADMIN API key only)\n\n| Tool | Description |\n|---|---|\n| `venice_billing_balance` | Get current USD, DIEM, and bundled-credit availability. |\n| `venice_billing_usage_analytics` | Get beta aggregate usage by date, model, and API key using a lookback or custom date range. |\n| `venice_billing_usage_history` | Walk detailed usage with cursor pagination, first-page filters, and JSON or CSV output. |\n\nUsage-history first pages default to 10 rows. JSON and CSV pages are returned whole, never truncated. A page exceeding 64 KiB returns an error without partial rows or a continuation cursor; restart with the original filters and a smaller `page_size` (minimum 10), or a narrower timestamp range. Retrying the same cursor cannot reduce the page size encoded in it.\n\nUsage-history continuation calls must send `cursor` without the original filters. CSV pages return a `csv:`-prefixed `nextCursor` so a cursor-only follow-up stays on `text/csv`. The deprecated `/billing/usage` route is not wrapped. Billing tools require an ADMIN `VENICE_API_KEY` and fail locally instead of falling back to SIWX. Inference keys cannot call these endpoints.\n\n### 🔑 API keys\n\n| Tool | Description |\n|---|---|\n| `venice_list_api_keys` | List active key metadata without full key secrets. ADMIN API key only. |\n| `venice_get_api_key` | Get one key's metadata, usage, balances, and rate limits. ADMIN API key only. |\n| `venice_api_key_rate_limits` | Get current balances, access status, tier, and model limits. API key only. |\n| `venice_api_key_rate_limit_logs` | Get the last 50 exceeded rate-limit events. ADMIN API key only; experimental upstream. |\n\nList, get, and rate-limit logs require an ADMIN `VENICE_API_KEY`. `venice_api_key_rate_limits` accepts an INFERENCE or ADMIN key. These tools never forward `SIGN-IN-WITH-X`. Web3 challenge and mint are not registered here.\n\n### 💳 x402 wallet helpers\n\n> Optional — only needed if you authenticate with a wallet via **x402** instead of an API key. See [**x402** — pay with a wallet](#x402--pay-with-a-wallet-no-account-required).\n\n| Tool | Description |\n|---|---|\n| `venice_x402_balance` | Check the prepaid x402 credit balance for a wallet address. |\n| `venice_x402_top_up_info` | Fetch the top-up payment requirements: the accepted Base and Solana USDC options, each with network, asset, receiver wallet, and minimum amount. Takes no arguments. |\n| `venice_x402_transactions` | List recent x402 top-up + debit transactions for a wallet. |\n\n## Configuration\n\n| Env var | Default | Notes |\n|---|---|---|\n| `VENICE_API_KEY` | _(none)_ | Your Venice API key. The simplest setup. |\n| `VENICE_DEFAULT_CHAT_MODEL` | `deepseek-v4-flash-0731` | |\n| `VENICE_DEFAULT_IMAGE_MODEL` | `flux-2-pro` | |\n| `VENICE_DEFAULT_TTS_MODEL` | `tts-kokoro` | |\n| `VENICE_DEFAULT_ASR_MODEL` | `openai/whisper-large-v3` | |\n| `VENICE_DISABLE_NSFW` | `0` | Set to `1` to remove NSFW capability notes from tool descriptions, hide the uncensored research and NSFW creative writing prompt templates, and drop \"uncensored\" from the server instructions. |\n| `VENICE_SEND_CLIENT_INFO` | `1` | Set to `0` to leave the MCP client's name and version out of the User-Agent sent to Venice. |\n| `VENICE_HTTP_TIMEOUT_MS` | `60000` | |\n| `VENICE_MAX_VIDEO_RESPONSE_BYTES` | `26214400` (25 MiB) | Maximum completed MP4 bytes buffered and base64-embedded by `venice_video_status`. |\n| `VENICE_MAX_IMAGE_RESPONSE_BYTES` | `33554432` (32 MiB) | Maximum response bytes buffered by `venice_image_generate`, `venice_image_edit`, `venice_image_multi_edit`, `venice_image_upscale`, and `venice_image_remove_bg`. Larger results are discarded with an error. |\n| `VENICE_MAX_AUDIO_RESPONSE_BYTES` | `33554432` (32 MiB) | Maximum audio bytes buffered and base64-embedded by `venice_tts` and `venice_music_status`. An oversized TTS result is discarded with an error; an oversized music result stays queued for a retry. |\n| `VENICE_SIWX_TOKEN` | _(none)_ | **x402** wallet-mode auth token — see [**x402** — pay with a wallet](#x402--pay-with-a-wallet-no-account-required). |\n| `PORT` | `3333` | HTTP-mode listener. |\n| `VENICE_MCP_HOST` | `127.0.0.1` | HTTP-mode bind address. Set to `0.0.0.0` for LAN/container exposure. |\n| `VENICE_MCP_AUTH_TOKEN` | _(none)_ | Bearer token required by `/mcp` whenever HTTP mode binds outside loopback. Use a long random value. |\n| `VENICE_MCP_ALLOW_UNAUTHENTICATED_HTTP` | `0` | Emergency escape hatch for unauthenticated exposed HTTP mode. Use only behind a trusted authenticated proxy. |\n| `VENICE_MCP_ALLOWED_HOSTS` | Localhost authorities on the listener port | Comma-separated exact HTTP Host values, including non-default ports. Set this for a reverse proxy, LAN hostname, or mapped port. No wildcards. |\n| `VENICE_MCP_ALLOWED_ORIGINS` | Localhost HTTP origins on the listener port | Comma-separated exact browser origins, including scheme and non-default port. Requests without Origin are accepted for native clients. No wildcards or `null` origins. |\n| `VENICE_MCP_MAX_SESSIONS` | `100` | Maximum active Streamable HTTP sessions. |\n| `VENICE_MCP_SESSION_TTL_MS` | `1800000` | Idle Streamable HTTP session lifetime before cleanup. |\n\n## Self-hosting (Streamable HTTP)\n\n`/mcp` is a credential-backed tool execution endpoint: callers can spend the configured Venice API key or x402 balance. When HTTP mode binds outside loopback, startup fails unless `VENICE_MCP_AUTH_TOKEN` is set, or `VENICE_MCP_ALLOW_UNAUTHENTICATED_HTTP=1` is explicitly set behind a trusted authenticated proxy.\n\nA loopback bind needs no token and starts without one, but it is not guarded by default: any local process can then call `/mcp` and spend the server's Venice credentials. Startup warns whenever the posture is unguarded, so set `VENICE_MCP_AUTH_TOKEN` even for local HTTP when more than one user or process shares the machine.\n\n```bash\nVENICE_API_KEY='<your-venice-api-key>' \\\nVENICE_MCP_AUTH_TOKEN='<choose-a-long-random-token>' \\\nVENICE_MCP_HOST=0.0.0.0 \\\nnpx -y @veniceai/mcp-server@0.3.2 --http\n# server at http://localhost:3333/mcp\n```\n\n`VENICE_MCP_HOST=0.0.0.0` makes the server reachable beyond loopback; leave it out to stay on loopback. No container image is published yet, so to run it in a container, build one from this repo's `Dockerfile`.\n\nClients should send `Authorization: Bearer <choose-a-long-random-token>` with HTTP MCP requests. HTTP clients should create new sessions without an `mcp-session-id` header and then reuse the server-issued session ID; unknown or malformed caller-provided session IDs are rejected. For reproducible production installs, pin the npm package version as shown in the examples instead of using an unversioned `latest` install path.\n\nHTTP requests to `/mcp` must also use an allowed Host and, when present, an allowed Origin. The defaults support `localhost`, `127.0.0.1`, and `[::1]` on the listener port. Configure the public authority in `VENICE_MCP_ALLOWED_HOSTS` when using a reverse proxy or another hostname, and the browser application's origin in `VENICE_MCP_ALLOWED_ORIGINS` when needed. A rejected request gets a `403` whose message names the variable to set, or says the header is invalid when it is missing, repeated, or malformed (such as `Origin: null`) and so can't be allowlisted. The server logs each rejected value once, up to 100 per process. Each configured list replaces its default list, so include any local entries you still use. Forwarded headers do not grant trust. These checks also apply when bearer authentication is configured; `/healthz` remains available for health probes. Set a bearer token even for local HTTP when possible.\n\nThe Origin allowlist is a request validation rule; it does not enable CORS or handle browser preflight requests. Cross-origin browser clients need a separately configured trusted proxy or server-side MCP connection.\n\nOr run from source — see [Development](#development) below.\n\n---\n\n## x402 — pay with a wallet, no account required\n\n> Skip this section if you're using `VENICE_API_KEY`. Everything below is optional and only matters if you specifically want to pay with a crypto wallet instead of a Venice account.\n\nVenice supports **EVM SIWE or Solana SIWX wallet authentication** backed by prepaid USDC credit on **Base or Solana mainnet**, in addition to the normal API key flow. This lets you use Venice with no email, phone, or KYC — your wallet is the only identity.\n\n### One-off wallet config\n\n```json\n{\n  \"mcpServers\": {\n    \"venice\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@veniceai/mcp-server@0.3.2\"],\n      \"env\": { \"VENICE_SIWX_TOKEN\": \"<base64 signed SIWX payload>\" }\n    }\n  }\n}\n```\n\nThe MCP server forwards the fixed `VENICE_SIWX_TOKEN` using Venice's preferred `SIGN-IN-WITH-X` header; it does not refresh the token.\n\n> **Known limitation:** Venice accepts each signed SIWX message only once, and only within 5 minutes of signing. The server sends the same `VENICE_SIWX_TOKEN` on every call, so only the first wallet-authenticated request succeeds; later calls return `401` until you sign a new token and restart the server ([#96](https://github.com/veniceai/venice-mcp-server/issues/96)). Use `VENICE_API_KEY` for anything beyond a one-off call.\n\n### How it works\n\n```\nTOP UP (when balance is low, outside this server)\n  POST /api/v1/x402/top-up  (no payment header)  →  402 + payment requirements\n  Choose a Base or Solana USDC option and sign it in your wallet\n  POST /api/v1/x402/top-up with PAYMENT-SIGNATURE: <signed>  →  Venice settles\n  the payment and credits your prepaid balance\n\nEACH WALLET-AUTHENTICATED REQUEST (manual renewal)\n  Sign a fresh EVM SIWE or Solana SIWX message → SIWX token (base64 JSON)\n  Set VENICE_SIWX_TOKEN and start or restart this MCP server\n  Make one request within 5 minutes of signing\n  MCP server sends SIGN-IN-WITH-X: <SIWX token>\n  Venice authenticates the wallet; inference debits its prepaid balance\n  Before another authenticated request, repeat with a new token\n```\n\nThis MCP server **never sees your private key**. EVM/Solana SIWX signing and USDC payment signing happen in your wallet — the server forwards only the signed SIWX token. The top-up helper discovers requirements but does not accept or submit payment signatures.\n\nThe helper tools `venice_x402_balance`, `venice_x402_top_up_info`, and `venice_x402_transactions` make balance + top-up flow inspectable from inside the agent.\n\n### Why prepaid instead of per-call?\n\n- ⚡ **Latency** — once topped up, calls are sub-100ms (no on-chain settlement per call)\n- 🧮 **Throughput** — Coinbase CDP facilitator settles top-ups in batches\n- 🔒 **Privacy** — wallet ↔ credit account is the only identity link; no email/phone/KYC\n- 🪙 **DIEM shortcut** — wallets linked to a Venice user with DIEM staked consume from staking balance, no USDC needed\n- 💸 **Min top-up $5** (anti-dust). Minimum balance to inference is $0.10.\n\n### Per-call HTTP 402 — not supported\n\nVenice rejects payment headers on inference routes. The preferred `PAYMENT-SIGNATURE` header is only used when submitting a signed payment to `/api/v1/x402/top-up`; this MCP server does not submit payments. After an external top-up, Venice debits the wallet's off-chain credit account on inference.\n\n### Auth-mode coverage notes\n\nSome Venice endpoints don't accept both auth modes:\n\n| Tool | API key | x402 | Notes |\n|---|---|---|---|\n| `venice_list_characters` | ✓ | ✗ | Character discovery endpoint is API-key only |\n| `venice_get_character` | ✓ | ✗ | Character discovery endpoint is API-key only |\n| `venice_character_reviews` | ✓ | ✗ | Character discovery endpoint is API-key only |\n| `venice_x402_balance` | ✗ | ✓ | Wallet-bound by design |\n| `venice_x402_transactions` | ✗ | ✓ | Wallet-bound by design |\n| `venice_x402_top_up_info` | ✓ | ✓ | Auth-free; same 402 response in both modes |\n\n### Hybrid\n\nSet both `VENICE_API_KEY` AND `VENICE_SIWX_TOKEN` — API key wins. SIWX is only used when the key is absent.\n\n---\n\n## Architecture\n\n```\n┌──────────────────────┐        stdio  OR        ┌────────────────────────┐\n│  MCP host            │      Streamable HTTP    │  @veniceai/mcp-server  │\n│  (Claude / Cursor /  ├────────────────────────▶│  - 45 tools            │\n│   ChatGPT / etc.)    │                         │  - 3 resources         │\n└──────────────────────┘                         │  - 9 prompts           │\n                                                 │  - header forwarder    │\n                                                 └────────────┬───────────┘\n                                                              │ HTTPS\n                                                              │   Authorization: Bearer ***\n                                                              │   OR\n                                                              │   SIGN-IN-WITH-X: <SIWX>\n                                                              ▼\n                                                 ┌────────────────────────┐\n                                                 │  Venice API            │\n                                                 │  api.venice.ai         │\n                                                 └────────────────────────┘\n```\n\n## Tool reference (endpoints + auth modes)\n\n<details>\n<summary>Click to expand — full mapping of tool → Venice endpoint → auth mode</summary>\n\n### Inference (API key OR x402 wallet)\n\n| Tool | Endpoint |\n|---|---|\n| `venice_chat` | `POST /v1/chat/completions` |\n| `venice_responses` | `POST /v1/responses` |\n| `venice_embeddings` | `POST /v1/embeddings` |\n| `venice_image_generate` | `POST /v1/image/generate` |\n| `venice_image_edit` | `POST /v1/image/edit` |\n| `venice_image_multi_edit` | `POST /v1/image/multi-edit` |\n| `venice_image_upscale` | `POST /v1/image/upscale` |\n| `venice_image_remove_bg` | `POST /v1/image/background-remove` |\n| `venice_video_generate` | `POST /v1/video/queue` |\n| `venice_video_status` | `POST /v1/video/retrieve` |\n| `venice_video_complete` | `POST /v1/video/complete` |\n| `venice_tts` | `POST /v1/audio/speech` |\n| `venice_asr` | `POST /v1/audio/transcriptions` |\n| `venice_voice_clone` (`create`) | `POST /v1/audio/voices` |\n| `venice_music_generate` | `POST /v1/audio/queue` |\n| `venice_music_status` | `POST /v1/audio/retrieve` |\n| `venice_music_complete` | `POST /v1/audio/complete` |\n| `venice_web_search` | `POST /v1/augment/search` |\n| `venice_web_scrape` | `POST /v1/augment/scrape` |\n| `venice_text_parser` | `POST /v1/augment/text-parser` |\n| `venice_crypto_rpc` | `POST /v1/crypto/rpc/:network` |\n\n### Catalog & quotes (auth-free)\n\n| Tool | Endpoint |\n|---|---|\n| `venice_list_models` | `GET /v1/models?type=…` (`type=all` when omitted) |\n| `venice_model_details` | `GET /v1/models?type=:type` (exact ID match in the filtered catalog) |\n| `venice_model_traits` | `GET /v1/models/traits` |\n| `venice_model_compatibility_mapping` | `GET /v1/models/compatibility_mapping` |\n| `venice_voice_clone` (`list`) / `venice://voices` | `GET /v1/models?type=tts` |\n| `venice_image_styles` | `GET /v1/image/styles` |\n| `venice_audio_quote` | `POST /v1/audio/quote` |\n| `venice_video_quote` | `POST /v1/video/quote` |\n| `venice_crypto_networks` | `GET /v1/crypto/rpc/networks` |\n| `venice_tee_attestation` | `GET /v1/tee/attestation?model=:model&nonce=:64_hex_chars` |\n| `venice_tee_signature` | `GET /v1/tee/signature?model=:model&request_id=:completion_id` |\n\n### Characters (API key only)\n\n| Tool | Endpoint |\n|---|---|\n| `venice_list_characters` | `GET /v1/characters` |\n| `venice_get_character` | `GET /v1/characters/:slug` |\n| `venice_character_reviews` | `GET /v1/characters/:slug/reviews` |\n| `venice_chat_with_character` | `POST /v1/chat/completions` (with `character_slug`) |\n\n### Billing and API-key reads (ADMIN API key only, except rate-limit tools)\n\n| Tool | Endpoint |\n|---|---|\n| `venice_billing_balance` | `GET /v1/billing/balance` |\n| `venice_billing_usage_analytics` | `GET /v1/billing/usage-analytics` |\n| `venice_billing_usage_history` | `GET /v1/billing/usage-history` |\n| `venice_list_api_keys` | `GET /v1/api_keys` |\n| `venice_get_api_key` | `GET /v1/api_keys/:id` |\n| `venice_api_key_rate_limits` | `GET /v1/api_keys/rate_limits` (INFERENCE or ADMIN) |\n| `venice_api_key_rate_limit_logs` | `GET /v1/api_keys/rate_limits/log` (ADMIN) |\n\n### x402 wallet helpers (SIWX reads + auth-free discovery)\n\n| Tool | Endpoint |\n|---|---|\n| `venice_x402_balance` | `GET /v1/x402/balance/:wallet` |\n| `venice_x402_top_up_info` | `POST /v1/x402/top-up` (no payment) |\n| `venice_x402_transactions` | `GET /v1/x402/transactions/:wallet` |\n\n</details>\n\n## Development\n\n```bash\nnpm install\nnpm run build             # generate dist/ locally\nnpm test                  # build, then run the full test suite\nnpm run test:unit         # unit tests only\nnpm run test:integration  # build, then spawn dist/cli.js + a mock Venice over real stdio JSON-RPC\nnpm start                 # stdio mode\nnpm run start:http        # http mode on :3333\n```\n\n`dist/` is generated by `npm run build` and is intentionally ignored by git rather than committed. Published npm packages include `dist/`. Direct source publication runs `prepublishOnly`; the release workflow builds and tests once, then publishes the resulting package archive without running package lifecycle scripts again.\n\n### Releases\n\nCommit matching versions in `package.json` and `package-lock.json` before creating the release tag. The release tag must be the package's exact semantic version, optionally prefixed with `v`. Build metadata such as `+build.5` is rejected because npm can normalize it away. The workflow builds the tagged commit and fails if the tag, package version, or lockfile version disagree; it never bumps the version or pushes a follow-up commit.\n\nBuild and publication run in separate jobs using Node.js 24 and npm 11.5.1 or newer. Release packing uses the same npm minimum as trusted publishing. This also excludes npm 10, which can run `prepare` despite `--ignore-scripts`. The build job has read-only repository permissions, tests the package, and uploads its archive. The publish job verifies the archive's checksum and publishes that exact archive using npm trusted publishing. Already-published versions are skipped. A failed build or version check requires fixing the release inputs before publication.\n\nPublished packages also bundle every production dependency at the version in `package-lock.json` (`bundleDependencies`), so `npx @veniceai/mcp-server@<version>` runs exactly the tested release and resolves nothing from the registry at install time.\n\n### Test layout\n\n```\ntest/\n├── config.test.ts             # env parsing, defaults, header precedence\n├── format.test.ts             # 402 formatter cases\n├── venice-client.test.ts      # HTTP client + real mock Venice\n├── tools.test.ts              # tool registry (45 tools) + endpoint/method/body mappings\n├── integration.test.ts        # end-to-end JSON-RPC over stdio against a mock Venice\n└── helpers/\n    ├── stub-client.ts         # in-process VeniceClient stub\n    └── mock-venice-server.ts  # real http.Server fake of Venice for integration tests\n```\n\nThe integration suite spawns the compiled CLI and speaks JSON-RPC on its stdin/stdout, exercising `initialize` → `tools/list` → `tools/call` → `resources/list` → `resources/read` against a real HTTP mock Venice in three auth scenarios (API key only, SIWX only, no auth).\n\nSecurity regression tests exercise HTTP Host/Origin validation, pre-parser authentication and transport cleanup using local fixtures and synthetic credentials.\n\n### End-to-end with live Venice + Base EVM harness\n\n`test/e2e/` currently exercises the EVM rail against the **real** Venice API and **real** Base mainnet—not a mock. Venice and the MCP x402 helpers support both Base and Solana, but this harness generates a throwaway EVM wallet and signs SIWE + EIP-3009 payloads with `viem`. The wallet is persisted at `.e2e-wallet.json` (chmod 600, gitignored—**never commit**).\n\nEach harness mode passes its intended credentials explicitly: wallet-mode children clear any inherited API key, and API-key children clear any inherited SIWX token. This keeps the two authentication runs independent even when the parent environment contains both credentials.\n\n| Phase | npm script | Cost | What it tests |\n|---|---|---|---|\n| `create` | `test:e2e:create` | free | Generate / reload wallet, print address + balance |\n| `empty` | `test:e2e:empty` | free | SIWX → MCP `venice_chat` → expect 402 with helpful diagnostics |\n| `topup` | `test:e2e:topup` | $5 USDC + gas | Sign EIP-3009 → POST `/api/v1/x402/top-up` → settle on-chain via CDP facilitator |\n| `funded` | `test:e2e:funded` | ~$0.001 / call | SIWX → MCP `venice_chat` → real LLM completion charged to prepaid balance |\n| `balance` | `test:e2e:balance` | free | Read on-chain USDC + Venice prepaid via `venice_x402_balance` tool |\n| `safe` | `test:e2e:safe` | free | `create` + `empty` + `balance` (no money spent) |\n\n```bash\n# Comprehensive — all 45 tools × both auth modes, side-by-side report (mint is always skipped)\nenv VENICE_API_KEY=<your-venice-api-key> npm run test:e2e:all-tools\n```\n\n## FAQ\n\n**Do I have to deal with crypto?**\nNo. The simple path is `VENICE_API_KEY` + a normal Venice account. x402 is an *option* for users who want a wallet-only flow.\n\n**Where does the wallet's private key live?**\nNot in this server. You sign the EVM SIWE or Solana SIWX message and any USDC top-up payment in your own wallet. The server only sees signed payloads and never accepts a private key.\n\n\n**Minimum top-up?**\n$5 USD (anti-dust). Minimum balance to call inference is $0.10. Default suggested top-up is $10.\n\n**Privacy guarantees?**\nNo email, phone, or KYC is required on the SIWX path. `venice_tee_attestation` and `venice_tee_signature` return hardware evidence for the caller to verify. This server does not encrypt chat. Its requests to Venice name the MCP client and this server in the User-Agent, for example `mcp-claude-code/2.0.14 @veniceai/mcp-server/0.3.1`, so Venice can see which agents use it. Set `VENICE_SEND_CLIENT_INFO=0` to send only this server's name.\n\n**DIEM staking?**\nIf your wallet is linked to a Venice user with DIEM staked, calls consume from the staking balance instead of USDC credits — no top-up needed.\n\n**Getting 402 errors even though I have an API key?**\nThe most common cause is that `VENICE_API_KEY` isn't being forwarded to the MCP server process. Most MCP hosts (Claude Desktop, Cursor, Codex, etc.) only pass environment variables that are **explicitly listed** in the `\"env\"` block of your MCP config — system-level env vars are not automatically inherited. Make sure your config looks like this:\n```json\n{\n  \"mcpServers\": {\n    \"venice\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@veniceai/mcp-server@0.3.2\"],\n      \"env\": { \"VENICE_API_KEY\": \"<your-venice-api-key>\" }\n    }\n  }\n}\n```\nIf the key is missing, blank or an unfilled placeholder such as `${VENICE_API_KEY}`, the server falls back to x402 mode and returns a 402 payment challenge. For a placeholder, it also logs a warning to stderr at startup.\n\n---\n\n## Support\n\nMaintained by Venice AI. Report bugs and request features in [GitHub issues](https://github.com/veniceai/venice-mcp-server/issues). For account or billing help, email support@venice.ai.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}