{"_id":"@motiblog/mcp","_rev":"16-7819edee556a32e294f554f04ff06670","name":"@motiblog/mcp","dist-tags":{"latest":"0.6.0"},"versions":{"0.1.0":{"name":"@motiblog/mcp","version":"0.1.0","keywords":["mcp","model-context-protocol","blog","seo","content","agent","claude","motiblog"],"license":"UNLICENSED","_id":"@motiblog/mcp@0.1.0","maintainers":[{"name":"hsanshine","email":"untilhamza@gmail.com"}],"homepage":"https://motiblog.ai/mcp","bugs":{"url":"https://github.com/HoverNotes/motiblog/issues"},"bin":{"motiblog-mcp":"dist/index.js","motiblog-mcp-http":"dist/http.js"},"dist":{"shasum":"28da0f2e0021bcca385f15641d9a7264afb23397","tarball":"https://registry.npmjs.org/@motiblog/mcp/-/mcp-0.1.0.tgz","fileCount":11,"integrity":"sha512-Xr6Z0mudYuSC+BVbIw9o+/QuQgFN3y8Yl1OgJXLVrIxasZPZcSoerE+85B888hW+Qi1Hr7HeySMa2rxW2otacg==","signatures":[{"sig":"MEYCIQDmf1AvRo2VhT5r4UXEjP4MYep7TUTjLYUf6WyXXLCi2gIhAJ3Tv0SGugSg9a2NnjbKOu1Cd65keVppMJrB4FL2BV9z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":409998},"main":"dist/lib.js","_from":"file:motiblog-mcp-0.1.0.tgz","types":"dist/lib.d.ts","//main":"src/lib.ts is the importable surface — pure re-exports. src/index.ts (stdio) and src/http.ts (standalone HTTP) execute on import, so they are run through the scripts below and must never be `main`: the API imports this package in-process.","engines":{"node":">=20"},"scripts":{"dev":"tsx watch src/index.ts","lint":"tsc --noEmit","test":"jest","build":"tsup","clean":"rm -rf dist","start":"tsx src/index.ts","start:http":"tsx src/http.ts"},"_npmUser":{"name":"hsanshine","email":"untilhamza@gmail.com"},"_resolved":"/private/var/folders/tp/8j9k46495dx_pfz8bttnk2z40000gn/T/7e897dbe9b72c36ab37e4df8be3ded8d/motiblog-mcp-0.1.0.tgz","_integrity":"sha512-Xr6Z0mudYuSC+BVbIw9o+/QuQgFN3y8Yl1OgJXLVrIxasZPZcSoerE+85B888hW+Qi1Hr7HeySMa2rxW2otacg==","repository":{"url":"git+https://github.com/HoverNotes/motiblog.git","type":"git","directory":"apps/mcp"},"_npmVersion":"10.9.4","description":"MotiBlog MCP server — run a whole blog from an agent: propose topics, generate, fact-check, approve through a governed gate, publish, or export to your own codebase","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.13.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"The workspace consumes raw TypeScript; npm consumers cannot. pnpm swaps these fields into the published manifest, so `main`/`bin` point at the tsup build in the tarball while apps/api keeps resolving src/ in development.","devDependencies":{"tsx":"^4.19.0","jest":"^30.3.0","tsup":"^8","ts-jest":"^29.4.6","typescript":"^5.6.0","@types/jest":"^30.0.0","@types/node":"^22.0.0","@motiblog/shared":"0.0.1"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.1.0_1787715282169_0.8765574568761119","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@motiblog/mcp","version":"0.1.1","keywords":["mcp","model-context-protocol","blog","seo","content","agent","claude","motiblog"],"license":"UNLICENSED","_id":"@motiblog/mcp@0.1.1","maintainers":[{"name":"hsanshine","email":"untilhamza@gmail.com"}],"homepage":"https://motiblog.ai/mcp","bugs":{"url":"https://github.com/HoverNotes/motiblog/issues"},"bin":{"mcp":"dist/index.js","motiblog-mcp":"dist/index.js","motiblog-mcp-http":"dist/http.js"},"dist":{"shasum":"d0dc9670ac40089654eadf249825038ed0f15f97","tarball":"https://registry.npmjs.org/@motiblog/mcp/-/mcp-0.1.1.tgz","fileCount":11,"integrity":"sha512-4WhJ1/qtSQGiIEl8P+SxcqEQmddkQM8/fkKVwmfK+5OpPgPW03mt0tkY8psUhDZsqbFwwHcGc4consZv3a9XPw==","signatures":[{"sig":"MEUCIQDAI5ECLZcr/lFz9D/zChYLI8HxfHZOEIdkqibliunyaAIgQoCWGRpWeZmSuNe/eMWs6YC8/eqv3DaNPwC0vM74Y/Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":410330},"main":"dist/lib.js","_from":"file:motiblog-mcp-0.1.1.tgz","types":"dist/lib.d.ts","//main":"src/lib.ts is the importable surface — pure re-exports. src/index.ts (stdio) and src/http.ts (standalone HTTP) execute on import, so they are run through the scripts below and must never be `main`: the API imports this package in-process.","engines":{"node":">=20"},"scripts":{"dev":"tsx watch src/index.ts","lint":"tsc --noEmit","test":"jest","build":"tsup","clean":"rm -rf dist","start":"tsx src/index.ts","start:http":"tsx src/http.ts"},"_npmUser":{"name":"hsanshine","email":"untilhamza@gmail.com"},"//bin-mcp":"The `mcp` alias is what makes `npx -y @motiblog/mcp` work. npx resolves the bin whose key matches the package's unscoped name; with only motiblog-mcp/-http it fails with 'could not determine executable to run'. Verified against the published 0.1.0 before adding this. Do not remove it.","_resolved":"/private/var/folders/tp/8j9k46495dx_pfz8bttnk2z40000gn/T/2058a4cbdd7007935bd6bf3d9dbc76c6/motiblog-mcp-0.1.1.tgz","_integrity":"sha512-4WhJ1/qtSQGiIEl8P+SxcqEQmddkQM8/fkKVwmfK+5OpPgPW03mt0tkY8psUhDZsqbFwwHcGc4consZv3a9XPw==","repository":{"url":"git+https://github.com/HoverNotes/motiblog.git","type":"git","directory":"apps/mcp"},"_npmVersion":"10.9.4","description":"MotiBlog MCP server — run a whole blog from an agent: propose topics, generate, fact-check, approve through a governed gate, publish, or export to your own codebase","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.13.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"The workspace consumes raw TypeScript; npm consumers cannot. pnpm swaps these fields into the published manifest, so `main`/`bin` point at the tsup build in the tarball while apps/api keeps resolving src/ in development.","devDependencies":{"tsx":"^4.19.0","jest":"^30.3.0","tsup":"^8","ts-jest":"^29.4.6","typescript":"^5.6.0","@types/jest":"^30.0.0","@types/node":"^22.0.0","@motiblog/shared":"0.0.1"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.1.1_1787715444290_0.3966728818235419","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@motiblog/mcp","version":"0.1.2","keywords":["mcp","model-context-protocol","blog","seo","content","agent","claude","motiblog"],"license":"UNLICENSED","_id":"@motiblog/mcp@0.1.2","maintainers":[{"name":"hsanshine","email":"untilhamza@gmail.com"}],"homepage":"https://motiblog.ai/mcp","bugs":{"url":"https://github.com/HoverNotes/motiblog/issues"},"bin":{"mcp":"dist/index.js","motiblog-mcp":"dist/index.js","motiblog-mcp-http":"dist/http.js"},"dist":{"shasum":"7ed3ac8110d1f20bd0b827cd389b831dfd6bbd1a","tarball":"https://registry.npmjs.org/@motiblog/mcp/-/mcp-0.1.2.tgz","fileCount":11,"integrity":"sha512-L1odPSAifyfC6BdAKhgskojuCq2+BuKBDBHb237Edyhzr35NdJiLQZZ5E4m7NgEDgYwTLYVj+wJTMbkO4Tei2g==","signatures":[{"sig":"MEQCIG+zUVvaxwHeveO8FwmnzgGMhuSVluu8byDc1XbrkB0UAiAJ7+vUI4hPQJoZtXbA17wdn5DF+PWfSAv8Lg8rbXN7QQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":434258},"main":"dist/lib.js","_from":"file:motiblog-mcp-0.1.2.tgz","types":"dist/lib.d.ts","//main":"src/lib.ts is the importable surface — pure re-exports. src/index.ts (stdio) and src/http.ts (standalone HTTP) execute on import, so they are run through the scripts below and must never be `main`: the API imports this package in-process.","engines":{"node":">=20"},"scripts":{"dev":"tsx watch src/index.ts","lint":"tsc --noEmit","test":"jest","build":"tsup","clean":"rm -rf dist","start":"tsx src/index.ts","start:http":"tsx src/http.ts"},"_npmUser":{"name":"hsanshine","email":"untilhamza@gmail.com"},"//bin-mcp":"The `mcp` alias is what makes `npx -y @motiblog/mcp` work. npx resolves the bin whose key matches the package's unscoped name; with only motiblog-mcp/-http it fails with 'could not determine executable to run'. Verified against the published 0.1.0 before adding this. Do not remove it.","_resolved":"/private/var/folders/tp/8j9k46495dx_pfz8bttnk2z40000gn/T/43c0b09bfcb68d5248b38739e6c8ddf6/motiblog-mcp-0.1.2.tgz","_integrity":"sha512-L1odPSAifyfC6BdAKhgskojuCq2+BuKBDBHb237Edyhzr35NdJiLQZZ5E4m7NgEDgYwTLYVj+wJTMbkO4Tei2g==","repository":{"url":"git+https://github.com/HoverNotes/motiblog.git","type":"git","directory":"apps/mcp"},"_npmVersion":"10.9.4","description":"MotiBlog MCP server — run a whole blog from an agent: propose topics, generate, fact-check, approve through a governed gate, publish, or export to your own codebase","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.13.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"The workspace consumes raw TypeScript; npm consumers cannot. pnpm swaps these fields into the published manifest, so `main`/`bin` point at the tsup build in the tarball while apps/api keeps resolving src/ in development.","devDependencies":{"tsx":"^4.19.0","jest":"^30.3.0","tsup":"^8","ts-jest":"^29.4.6","typescript":"^5.6.0","@types/jest":"^30.0.0","@types/node":"^22.0.0","@motiblog/shared":"0.0.1"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.1.2_1787717302335_0.5239242689129482","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@motiblog/mcp","version":"0.1.3","keywords":["mcp","model-context-protocol","blog","seo","content","agent","claude","motiblog"],"license":"UNLICENSED","_id":"@motiblog/mcp@0.1.3","maintainers":[{"name":"hsanshine","email":"untilhamza@gmail.com"}],"homepage":"https://motiblog.ai/mcp","bugs":{"url":"https://github.com/HoverNotes/motiblog/issues"},"bin":{"mcp":"dist/index.js","motiblog-mcp":"dist/index.js","motiblog-mcp-http":"dist/http.js"},"dist":{"shasum":"5b2e1089b8ce9d90481dd9653cce18de588f23b4","tarball":"https://registry.npmjs.org/@motiblog/mcp/-/mcp-0.1.3.tgz","fileCount":11,"integrity":"sha512-TVDq3tXL/YFuAXsxMSLKHmvQRbzrymmlPgFBvUobdVOBZNVODXTXMqS9rtdKGOs9PeLQiKWWxYf2nss8Hwg2Ew==","signatures":[{"sig":"MEUCIQC58WiolyEGE0Nf8VE2RQ/d7dqmhy5NDfOoiDlFUV1C5wIgHQCODuYCXHzHqQuZorrTtPyXByyIcoEq1/L65Z0in24=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":437327},"main":"dist/lib.js","_from":"file:motiblog-mcp-0.1.3.tgz","types":"dist/lib.d.ts","//main":"src/lib.ts is the importable surface — pure re-exports. src/index.ts (stdio) and src/http.ts (standalone HTTP) execute on import, so they are run through the scripts below and must never be `main`: the API imports this package in-process.","engines":{"node":">=20"},"mcpName":"ai.motiblog/mcp","scripts":{"dev":"tsx watch src/index.ts","lint":"tsc --noEmit","test":"jest","build":"tsup","clean":"rm -rf dist","start":"tsx src/index.ts","start:http":"tsx src/http.ts"},"_npmUser":{"name":"hsanshine","email":"untilhamza@gmail.com"},"//bin-mcp":"The `mcp` alias is what makes `npx -y @motiblog/mcp` work. npx resolves the bin whose key matches the package's unscoped name; with only motiblog-mcp/-http it fails with 'could not determine executable to run'. Verified against the published 0.1.0 before adding this. Do not remove it.","//mcpName":"Links this npm package to its official MCP Registry entry. The registry refuses to publish a listing that names an npm package which does not point back at it — that pairing is how it proves the same owner controls both. Must equal `name` in server.json.","_resolved":"/private/var/folders/tp/8j9k46495dx_pfz8bttnk2z40000gn/T/0ee9a0c34e1cb746436a6af8c06c34d4/motiblog-mcp-0.1.3.tgz","_integrity":"sha512-TVDq3tXL/YFuAXsxMSLKHmvQRbzrymmlPgFBvUobdVOBZNVODXTXMqS9rtdKGOs9PeLQiKWWxYf2nss8Hwg2Ew==","repository":{"url":"git+https://github.com/HoverNotes/motiblog.git","type":"git","directory":"apps/mcp"},"_npmVersion":"10.9.4","description":"MotiBlog MCP server — run a whole blog from an agent: propose topics, generate, fact-check, approve through a governed gate, publish, or export to your own codebase","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.13.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"The workspace consumes raw TypeScript; npm consumers cannot. pnpm swaps these fields into the published manifest, so `main`/`bin` point at the tsup build in the tarball while apps/api keeps resolving src/ in development.","devDependencies":{"tsx":"^4.19.0","jest":"^30.3.0","tsup":"^8","ts-jest":"^29.4.6","typescript":"^5.6.0","@types/jest":"^30.0.0","@types/node":"^22.0.0","@motiblog/shared":"0.0.1"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.1.3_1787718749873_0.40459500184375385","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@motiblog/mcp","version":"0.2.0","keywords":["mcp","model-context-protocol","blog","seo","content","agent","claude","motiblog"],"license":"UNLICENSED","_id":"@motiblog/mcp@0.2.0","maintainers":[{"name":"hsanshine","email":"untilhamza@gmail.com"}],"homepage":"https://motiblog.ai/mcp","bugs":"https://github.com/HoverNotes/motiblog/issues","bin":{"mcp":"dist/index.js","motiblog-mcp":"dist/index.js","motiblog-mcp-http":"dist/http.js"},"dist":{"shasum":"f5efb11201a65255e21b88197022fbeab1b5e7b2","tarball":"https://registry.npmjs.org/@motiblog/mcp/-/mcp-0.2.0.tgz","fileCount":11,"integrity":"sha512-ptvn/WGnBztkLb+WSuWZsioNO8IgZiCvT2NEBSZgtfoIfPXdZXVJvX32yPtEY28bmFxhDrFfZT9pSy3JQUqK6g==","signatures":[{"sig":"MEUCIAbEXFTuWqUXciUUQF2VRLpj8ZzZgV00JxVgHKzoHCmiAiEAwdSXHrvL1p2cR22CcMfyz+iXIkoImXQ6o4l7vu8aUj8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":973265},"main":"dist/lib.js","types":"dist/lib.d.ts","//main":"src/lib.ts is the importable surface — pure re-exports. src/index.ts (stdio) and src/http.ts (standalone HTTP) execute on import, so they are run through the scripts below and must never be `main`: the API imports this package in-process.","engines":{"node":">=20"},"mcpName":"ai.motiblog/mcp","scripts":{"dev":"tsx watch src/index.ts","lint":"tsc --noEmit","test":"jest","build":"tsup","clean":"rm -rf dist","start":"tsx src/index.ts","start:http":"tsx src/http.ts"},"_npmUser":{"name":"hsanshine","email":"untilhamza@gmail.com"},"//bin-mcp":"The `mcp` alias is what makes `npx -y @motiblog/mcp` work. npx resolves the bin whose key matches the package's unscoped name; with only motiblog-mcp/-http it fails with 'could not determine executable to run'. Verified against the published 0.1.0 before adding this. Do not remove it.","//mcpName":"Links this npm package to its official MCP Registry entry. The registry refuses to publish a listing that names an npm package which does not point back at it — that pairing is how it proves the same owner controls both. Must equal `name` in server.json.","repository":{"url":"git+https://github.com/HoverNotes/motiblog.git","type":"git","directory":"apps/mcp"},"description":"Operate MotiBlog headlessly from an agent: projects, content, Search Console, analytics, publishing, and export","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.13.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"The workspace consumes raw TypeScript; npm consumers cannot. pnpm swaps these fields into the published manifest, so `main`/`bin` point at the tsup build in the tarball while apps/api keeps resolving src/ in development.","devDependencies":{"tsx":"^4.19.0","jest":"^30.3.0","tsup":"^8","ts-jest":"^29.4.6","typescript":"^5.6.0","@types/jest":"^30.0.0","@types/node":"^22.0.0","@motiblog/shared":"0.0.1"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.2.0_1787732852127_0.19373396753301586","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@motiblog/mcp","version":"0.3.0","keywords":["mcp","model-context-protocol","blog","seo","content","agent","claude","motiblog"],"license":"UNLICENSED","_id":"@motiblog/mcp@0.3.0","maintainers":[{"name":"hsanshine","email":"untilhamza@gmail.com"}],"homepage":"https://motiblog.ai/mcp","bugs":{"url":"https://github.com/HoverNotes/motiblog/issues"},"dist":{"shasum":"2ba2bf904d7aee360b6e37a2fbd6936ad373a88a","tarball":"https://registry.npmjs.org/@motiblog/mcp/-/mcp-0.3.0.tgz","fileCount":12,"integrity":"sha512-b1FlZn8rw1EEggOPKdrOBxSUZ0ke4Ss515M9Q/lexk2H08xSQDTm6c0CBzVIGta1lKzA+b11VI0AkS5E+Fjshw==","signatures":[{"sig":"MEUCIQD8qCC5nxjaunpUcOYN/AKGZj44qu00JQkZj6Swxg2h0QIgVP0R7e2a+3Gm2x0dknnPv0oFpIq4lZD3/65DElsGh94=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":991695},"main":"src/lib.ts","//main":"src/lib.ts is the importable surface — pure re-exports. src/index.ts (stdio) and src/http.ts (standalone HTTP) execute on import, so they are run through the scripts below and must never be `main`: the API imports this package in-process.","engines":{"node":">=20"},"gitHead":"29899174cf8426e8039c8f6153f7ecd8f0910cba","mcpName":"ai.motiblog/mcp","scripts":{"dev":"tsx watch src/index.ts","lint":"tsc --noEmit","test":"jest","build":"tsup","clean":"rm -rf dist","start":"tsx src/index.ts","start:http":"tsx src/http.ts","prepublishOnly":"tsup"},"_npmUser":{"name":"hsanshine","email":"untilhamza@gmail.com"},"//bin-mcp":"The `mcp` alias is what makes `npx -y @motiblog/mcp` work. npx resolves the bin whose key matches the package's unscoped name; with only motiblog-mcp/-http it fails with 'could not determine executable to run'. Verified against the published 0.1.0 before adding this. Do not remove it.","//mcpName":"Links this npm package to its official MCP Registry entry. The registry refuses to publish a listing that names an npm package which does not point back at it — that pairing is how it proves the same owner controls both. Must equal `name` in server.json.","repository":{"url":"git+https://github.com/HoverNotes/motiblog.git","type":"git","directory":"apps/mcp"},"_npmVersion":"10.9.4","description":"Operate MotiBlog headlessly from an agent: projects, content, Search Console, analytics, publishing, and export","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.13.0"},"publishConfig":{"bin":{"mcp":"dist/index.js","motiblog-mcp":"dist/index.js","motiblog-mcp-http":"dist/http.js"},"main":"dist/lib.js","types":"dist/lib.d.ts","access":"public"},"_hasShrinkwrap":false,"//publishConfig":"The workspace consumes raw TypeScript; npm consumers cannot. pnpm swaps these fields into the published manifest, so `main`/`bin` point at the tsup build in the tarball while apps/api keeps resolving src/ in development.","devDependencies":{"tsx":"^4.19.0","jest":"^30.3.0","tsup":"^8","ts-jest":"^29.4.6","typescript":"^5.6.0","@types/jest":"^30.0.0","@types/node":"^22.0.0","@motiblog/shared":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.3.0_1787759688616_0.6164877734613667","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@motiblog/mcp","version":"0.3.1","keywords":["mcp","model-context-protocol","blog","seo","content","agent","claude","motiblog"],"license":"UNLICENSED","_id":"@motiblog/mcp@0.3.1","maintainers":[{"name":"hsanshine","email":"untilhamza@gmail.com"}],"homepage":"https://motiblog.ai/mcp","bugs":"https://github.com/HoverNotes/motiblog/issues","bin":{"mcp":"dist/index.js","motiblog-mcp":"dist/index.js","motiblog-mcp-http":"dist/http.js"},"dist":{"shasum":"2acdb34b157c7bab6d0ec1b54163323036de99c0","tarball":"https://registry.npmjs.org/@motiblog/mcp/-/mcp-0.3.1.tgz","fileCount":11,"integrity":"sha512-RXenYmiJQKn9uLAA4c7flY1oC7nbQsSKtoKj7lp9uKQzUodoxF+Bx3pYJnOuLeuVmJ58iYJh1bIo5l0LTVBYxQ==","signatures":[{"sig":"MEQCIFaRVnZrbwuLYTi85WFIpUvTux7SP5nN1V+KLgPGzW/fAiAxPoGnERUEuJYTbBtmNxTndwIR8HSqlUpaxzvZdR9hGQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":990742},"main":"dist/lib.js","types":"dist/lib.d.ts","//main":"src/lib.ts is the importable surface — pure re-exports. src/index.ts (stdio) and src/http.ts (standalone HTTP) execute on import, so they are run through the scripts below and must never be `main`: the API imports this package in-process.","engines":{"node":">=20"},"mcpName":"ai.motiblog/mcp","scripts":{"dev":"tsx watch src/index.ts","lint":"tsc --noEmit","test":"jest","build":"tsup","clean":"rm -rf dist","start":"tsx src/index.ts","start:http":"tsx src/http.ts"},"_npmUser":{"name":"hsanshine","email":"untilhamza@gmail.com"},"//bin-mcp":"The `mcp` alias is what makes `npx -y @motiblog/mcp` work. npx resolves the bin whose key matches the package's unscoped name; with only motiblog-mcp/-http it fails with 'could not determine executable to run'. Verified against the published 0.1.0 before adding this. Do not remove it.","//mcpName":"Links this npm package to its official MCP Registry entry. The registry refuses to publish a listing that names an npm package which does not point back at it — that pairing is how it proves the same owner controls both. Must equal `name` in server.json.","repository":{"url":"git+https://github.com/HoverNotes/motiblog.git","type":"git","directory":"apps/mcp"},"description":"Agent-first SEO research and publishing: competitors, SERPs, internal links, and Search Console","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.13.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"The workspace consumes raw TypeScript; npm consumers cannot. pnpm swaps these fields into the published manifest, so `main`/`bin` point at the tsup build in the tarball while apps/api keeps resolving src/ in development.","devDependencies":{"tsx":"^4.19.0","jest":"^30.3.0","tsup":"^8","ts-jest":"^29.4.6","typescript":"^5.6.0","@types/jest":"^30.0.0","@types/node":"^22.0.0","@motiblog/shared":"0.0.1"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.3.1_1787760983051_0.30302239684903465","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@motiblog/mcp","version":"0.3.2","keywords":["mcp","model-context-protocol","blog","seo","content","agent","claude","motiblog"],"license":"UNLICENSED","_id":"@motiblog/mcp@0.3.2","maintainers":[{"name":"hsanshine","email":"untilhamza@gmail.com"}],"homepage":"https://motiblog.ai/mcp","bugs":"https://github.com/HoverNotes/motiblog/issues","bin":{"mcp":"dist/index.js","motiblog-mcp":"dist/index.js","motiblog-mcp-http":"dist/http.js"},"dist":{"shasum":"e71b075c9d3e94324ffbe1c72f355099b149889a","tarball":"https://registry.npmjs.org/@motiblog/mcp/-/mcp-0.3.2.tgz","fileCount":11,"integrity":"sha512-XZG9x/xc+OrIIUE4YcM18Mz8v4y78hj2G/J6JoO1DD33nZ+XqZIvHE+SwkvQjEqn6/afxqHsIvZtCaeO/jX9Tg==","signatures":[{"sig":"MEYCIQCVoOOaZvLDL/dGGIXyOVNCEKcoDtkWT1mI/tuRtBLpEgIhANavjGx+uvdZH5IDtNX827bhR2wN1LH5pvAKSqDCUC7t","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":990742},"main":"dist/lib.js","types":"dist/lib.d.ts","//main":"src/lib.ts is the importable surface — pure re-exports. src/index.ts (stdio) and src/http.ts (standalone HTTP) execute on import, so they are run through the scripts below and must never be `main`: the API imports this package in-process.","engines":{"node":">=20"},"mcpName":"ai.motiblog/mcp","scripts":{"dev":"tsx watch src/index.ts","lint":"tsc --noEmit","test":"jest","build":"tsup","clean":"rm -rf dist","start":"tsx src/index.ts","start:http":"tsx src/http.ts"},"_npmUser":{"name":"hsanshine","email":"untilhamza@gmail.com"},"//bin-mcp":"The `mcp` alias is what makes `npx -y @motiblog/mcp` work. npx resolves the bin whose key matches the package's unscoped name; with only motiblog-mcp/-http it fails with 'could not determine executable to run'. Verified against the published 0.1.0 before adding this. Do not remove it.","//mcpName":"Links this npm package to its official MCP Registry entry. The registry refuses to publish a listing that names an npm package which does not point back at it — that pairing is how it proves the same owner controls both. Must equal `name` in server.json.","repository":{"url":"git+https://github.com/HoverNotes/motiblog.git","type":"git","directory":"apps/mcp"},"description":"Agent-first SEO research and publishing: competitors, SERPs, internal links, and Search Console","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.13.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"The workspace consumes raw TypeScript; npm consumers cannot. pnpm swaps these fields into the published manifest, so `main`/`bin` point at the tsup build in the tarball while apps/api keeps resolving src/ in development.","devDependencies":{"tsx":"^4.19.0","jest":"^30.3.0","tsup":"^8","ts-jest":"^29.4.6","typescript":"^5.6.0","@types/jest":"^30.0.0","@types/node":"^22.0.0","@motiblog/shared":"0.0.1"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.3.2_1787761314151_0.5257265328935559","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@motiblog/mcp","version":"0.3.3","keywords":["mcp","model-context-protocol","blog","seo","content","agent","claude","motiblog"],"license":"UNLICENSED","_id":"@motiblog/mcp@0.3.3","maintainers":[{"name":"hsanshine","email":"untilhamza@gmail.com"}],"homepage":"https://motiblog.ai/mcp","bugs":"https://github.com/HoverNotes/motiblog/issues","bin":{"mcp":"dist/index.js","motiblog-mcp":"dist/index.js","motiblog-mcp-http":"dist/http.js"},"dist":{"shasum":"00a215a45f9c5aba0634bdc5c968ca9ba4b076b1","tarball":"https://registry.npmjs.org/@motiblog/mcp/-/mcp-0.3.3.tgz","fileCount":11,"integrity":"sha512-q4t673hQZhwE9zOZk4gGklvd5UUIlTMb85aEJ4ks9doQzCMDJTHuASne8xuSqHibJQb+HpmI5AgWam4rk9PzFQ==","signatures":[{"sig":"MEQCIBfWQGlxQfihiG208xNgTpuYbWb49467azMyguPA4FVYAiAJiueKiGyd4pMivvSvc73JXqdFdSJ+tziU84vvxsz/Og==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":997894},"main":"dist/lib.js","types":"dist/lib.d.ts","//main":"src/lib.ts is the importable surface — pure re-exports. src/index.ts (stdio) and src/http.ts (standalone HTTP) execute on import, so they are run through the scripts below and must never be `main`: the API imports this package in-process.","engines":{"node":">=20"},"mcpName":"ai.motiblog/mcp","scripts":{"dev":"tsx watch src/index.ts","lint":"tsc --noEmit","test":"jest","build":"tsup","clean":"rm -rf dist","start":"tsx src/index.ts","start:http":"tsx src/http.ts"},"_npmUser":{"name":"hsanshine","email":"untilhamza@gmail.com"},"//bin-mcp":"The `mcp` alias is what makes `npx -y @motiblog/mcp` work. npx resolves the bin whose key matches the package's unscoped name; with only motiblog-mcp/-http it fails with 'could not determine executable to run'. Verified against the published 0.1.0 before adding this. Do not remove it.","//mcpName":"Links this npm package to its official MCP Registry entry. The registry refuses to publish a listing that names an npm package which does not point back at it — that pairing is how it proves the same owner controls both. Must equal `name` in server.json.","repository":{"url":"git+https://github.com/HoverNotes/motiblog.git","type":"git","directory":"apps/mcp"},"description":"Agent-first SEO research and publishing: competitors, SERPs, internal links, and Search Console","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.13.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"The workspace consumes raw TypeScript; npm consumers cannot. pnpm swaps these fields into the published manifest, so `main`/`bin` point at the tsup build in the tarball while apps/api keeps resolving src/ in development.","devDependencies":{"tsx":"^4.19.0","jest":"^30.3.0","tsup":"^8","ts-jest":"^29.4.6","typescript":"^5.6.0","@types/jest":"^30.0.0","@types/node":"^22.0.0","@motiblog/shared":"0.0.1"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.3.3_1787764664283_0.19439453029995213","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@motiblog/mcp","version":"0.3.4","keywords":["mcp","model-context-protocol","blog","seo","content","agent","claude","motiblog"],"license":"UNLICENSED","_id":"@motiblog/mcp@0.3.4","maintainers":[{"name":"hsanshine","email":"untilhamza@gmail.com"}],"homepage":"https://motiblog.ai/mcp","bugs":"https://github.com/HoverNotes/motiblog/issues","bin":{"mcp":"dist/index.js","motiblog-mcp":"dist/index.js","motiblog-mcp-http":"dist/http.js"},"dist":{"shasum":"164b058371cde6ec8d2ad17b64df414b5af29cf1","tarball":"https://registry.npmjs.org/@motiblog/mcp/-/mcp-0.3.4.tgz","fileCount":11,"integrity":"sha512-0yt0z2crerAJZD28zl9znIXoA4IrIEVn0cTU9+LFcT0H8UubVrPnMtDx7tHIAchxbd1/Pzmy4Mbj6427JSIcHg==","signatures":[{"sig":"MEUCIQDmQejspwDUtq8HhHiqh0bShKpJKSGJJOtbXYLT3HxfsAIgK4evqC3Y/t46G5chMvaPBt1oiNGEWbZLKXWiJKDduDU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1003906},"main":"dist/lib.js","types":"dist/lib.d.ts","//main":"src/lib.ts is the importable surface — pure re-exports. src/index.ts (stdio) and src/http.ts (standalone HTTP) execute on import, so they are run through the scripts below and must never be `main`: the API imports this package in-process.","engines":{"node":">=20"},"mcpName":"ai.motiblog/mcp","scripts":{"dev":"tsx watch src/index.ts","lint":"tsc --noEmit","test":"jest","build":"tsup","clean":"rm -rf dist","start":"tsx src/index.ts","start:http":"tsx src/http.ts"},"_npmUser":{"name":"hsanshine","email":"untilhamza@gmail.com"},"//bin-mcp":"The `mcp` alias is what makes `npx -y @motiblog/mcp` work. npx resolves the bin whose key matches the package's unscoped name; with only motiblog-mcp/-http it fails with 'could not determine executable to run'. Verified against the published 0.1.0 before adding this. Do not remove it.","//mcpName":"Links this npm package to its official MCP Registry entry. The registry refuses to publish a listing that names an npm package which does not point back at it — that pairing is how it proves the same owner controls both. Must equal `name` in server.json.","repository":{"url":"git+https://github.com/HoverNotes/motiblog.git","type":"git","directory":"apps/mcp"},"description":"Agent-first SEO research and publishing: competitors, SERPs, internal links, and Search Console","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.13.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"The workspace consumes raw TypeScript; npm consumers cannot. pnpm swaps these fields into the published manifest, so `main`/`bin` point at the tsup build in the tarball while apps/api keeps resolving src/ in development.","devDependencies":{"tsx":"^4.19.0","jest":"^30.3.0","tsup":"^8","ts-jest":"^29.4.6","typescript":"^5.6.0","@types/jest":"^30.0.0","@types/node":"^22.0.0","@motiblog/shared":"0.0.1"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.3.4_1787765743059_0.7403147134515258","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"@motiblog/mcp","version":"0.3.5","keywords":["mcp","model-context-protocol","blog","seo","content","agent","claude","motiblog"],"license":"UNLICENSED","_id":"@motiblog/mcp@0.3.5","maintainers":[{"name":"hsanshine","email":"untilhamza@gmail.com"}],"homepage":"https://motiblog.ai/mcp","bugs":{"url":"https://github.com/HoverNotes/motiblog/issues"},"bin":{"mcp":"dist/index.js","motiblog-mcp":"dist/index.js","motiblog-mcp-http":"dist/http.js"},"dist":{"shasum":"f1c646393cd7f7e81af80113822776d38f705aaf","tarball":"https://registry.npmjs.org/@motiblog/mcp/-/mcp-0.3.5.tgz","fileCount":11,"integrity":"sha512-h93jBOHs/tg82PC3f2K3FZuBNyxSrLwEwhKBpOlcAe4y2h8yPLcy9mueUuXNZ/eCly5RjwG6VjWw7zS1yPtmmw==","signatures":[{"sig":"MEQCIHf8mwdNPKkQw921Boap70RUHCjOqZPsk8s2MkxuqM+bAiBh8hGvn0EsE0oGd0fEVCf/8bsG6/NSkolmgNJnwGtCtQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1020769},"main":"dist/lib.js","_from":"file:motiblog-mcp-0.3.5.tgz","types":"dist/lib.d.ts","//main":"src/lib.ts is the importable surface — pure re-exports. src/index.ts (stdio) and src/http.ts (standalone HTTP) execute on import, so they are run through the scripts below and must never be `main`: the API imports this package in-process.","engines":{"node":">=20"},"mcpName":"ai.motiblog/mcp","scripts":{"dev":"tsx watch src/index.ts","lint":"tsc --noEmit","test":"jest","build":"tsup","clean":"rm -rf dist","start":"tsx src/index.ts","start:http":"tsx src/http.ts"},"_npmUser":{"name":"hsanshine","email":"untilhamza@gmail.com"},"//bin-mcp":"The `mcp` alias is what makes `npx -y @motiblog/mcp` work. npx resolves the bin whose key matches the package's unscoped name; with only motiblog-mcp/-http it fails with 'could not determine executable to run'. Verified against the published 0.1.0 before adding this. Do not remove it.","//mcpName":"Links this npm package to its official MCP Registry entry. The registry refuses to publish a listing that names an npm package which does not point back at it — that pairing is how it proves the same owner controls both. Must equal `name` in server.json.","_resolved":"/private/var/folders/tp/8j9k46495dx_pfz8bttnk2z40000gn/T/e967f780e95757d72e153e77ebdce21a/motiblog-mcp-0.3.5.tgz","_integrity":"sha512-h93jBOHs/tg82PC3f2K3FZuBNyxSrLwEwhKBpOlcAe4y2h8yPLcy9mueUuXNZ/eCly5RjwG6VjWw7zS1yPtmmw==","repository":{"url":"git+https://github.com/HoverNotes/motiblog.git","type":"git","directory":"apps/mcp"},"_npmVersion":"10.9.4","description":"Agent-first SEO research and publishing: competitors, SERPs, internal links, and Search Console","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.13.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"The workspace consumes raw TypeScript; npm consumers cannot. pnpm swaps these fields into the published manifest, so `main`/`bin` point at the tsup build in the tarball while apps/api keeps resolving src/ in development.","devDependencies":{"tsx":"^4.19.0","jest":"^30.3.0","tsup":"^8","ts-jest":"^29.4.6","typescript":"^5.6.0","@types/jest":"^30.0.0","@types/node":"^22.0.0","@motiblog/shared":"0.0.1"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.3.5_1787887750238_0.8345577946561951","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@motiblog/mcp","version":"0.5.0","keywords":["mcp","model-context-protocol","blog","seo","content","agent","claude","motiblog"],"license":"UNLICENSED","_id":"@motiblog/mcp@0.5.0","maintainers":[{"name":"hsanshine","email":"untilhamza@gmail.com"}],"homepage":"https://motiblog.ai/mcp","bugs":{"url":"https://github.com/HoverNotes/motiblog/issues"},"bin":{"mcp":"dist/index.js","motiblog-mcp":"dist/index.js","motiblog-mcp-http":"dist/http.js"},"dist":{"shasum":"874ce8317e188834e440339f0ca010970fc782e8","tarball":"https://registry.npmjs.org/@motiblog/mcp/-/mcp-0.5.0.tgz","fileCount":11,"integrity":"sha512-O1n4yRoFOU9JYBGs8Ryo+SpTUZR4ML9eVuc3TVxUXVnv8Pe3xV+6UqQDVkjwFjEo1g7+ydfoFVQo/ER9He6FNA==","signatures":[{"sig":"MEUCIQC4j9marlxiOzmdrAotOCGgOQykoeHqemj+5ZNRYy1uFgIgcKiZeWhNIRU8zWBkXXRL1F3tI2LUUiY+AlCaZWXhNyw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1106060},"main":"dist/lib.js","_from":"file:motiblog-mcp-0.5.0.tgz","types":"dist/lib.d.ts","//main":"src/lib.ts is the importable surface — pure re-exports. src/index.ts (stdio) and src/http.ts (standalone HTTP) execute on import, so they are run through the scripts below and must never be `main`: the API imports this package in-process.","engines":{"node":">=20"},"mcpName":"ai.motiblog/mcp","scripts":{"dev":"tsx watch src/index.ts","lint":"tsc --noEmit","test":"jest","build":"tsup","clean":"rm -rf dist","start":"tsx src/index.ts","start:http":"tsx src/http.ts"},"_npmUser":{"name":"hsanshine","email":"untilhamza@gmail.com"},"//bin-mcp":"The `mcp` alias is what makes `npx -y @motiblog/mcp` work. npx resolves the bin whose key matches the package's unscoped name; with only motiblog-mcp/-http it fails with 'could not determine executable to run'. Verified against the published 0.1.0 before adding this. Do not remove it.","//mcpName":"Links this npm package to its official MCP Registry entry. The registry refuses to publish a listing that names an npm package which does not point back at it — that pairing is how it proves the same owner controls both. Must equal `name` in server.json.","_resolved":"/private/var/folders/tp/8j9k46495dx_pfz8bttnk2z40000gn/T/553efcb8d1d52715292a352f039d90d5/motiblog-mcp-0.5.0.tgz","_integrity":"sha512-O1n4yRoFOU9JYBGs8Ryo+SpTUZR4ML9eVuc3TVxUXVnv8Pe3xV+6UqQDVkjwFjEo1g7+ydfoFVQo/ER9He6FNA==","repository":{"url":"git+https://github.com/HoverNotes/motiblog.git","type":"git","directory":"apps/mcp"},"_npmVersion":"10.9.4","description":"Agent-first SEO research and publishing: competitors, SERPs, internal links, and Search Console","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.13.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"The workspace consumes raw TypeScript; npm consumers cannot. pnpm swaps these fields into the published manifest, so `main`/`bin` point at the tsup build in the tarball while apps/api keeps resolving src/ in development.","devDependencies":{"tsx":"^4.19.0","jest":"^30.3.0","tsup":"^8","ts-jest":"^29.4.6","typescript":"^5.6.0","@types/jest":"^30.0.0","@types/node":"^22.0.0","@motiblog/shared":"0.0.1"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.5.0_1787893927307_0.08554063012085189","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@motiblog/mcp","version":"0.5.1","keywords":["mcp","model-context-protocol","blog","seo","content","agent","claude","motiblog"],"license":"UNLICENSED","_id":"@motiblog/mcp@0.5.1","maintainers":[{"name":"hsanshine","email":"untilhamza@gmail.com"}],"homepage":"https://motiblog.ai/mcp","bugs":{"url":"https://github.com/HoverNotes/motiblog/issues"},"bin":{"mcp":"dist/index.js","motiblog-mcp":"dist/index.js","motiblog-mcp-http":"dist/http.js"},"dist":{"shasum":"3d28899833f0b56eb1055080cb56e5c62d424444","tarball":"https://registry.npmjs.org/@motiblog/mcp/-/mcp-0.5.1.tgz","fileCount":11,"integrity":"sha512-slskjmvQsxPjeHF+sy0Z3OGZc/ufPuR+w4HAIKClzdYOoX+0hL3IdzqzaZj79i1iLOPUC0myYyOSHB/PdoUwzg==","signatures":[{"sig":"MEQCIG+vJsbwWF42pb98PGX0/hWiL0pbSQik/PUvMzcyOEO7AiBJvRMz0SCGESNnmM2jGTdv/7G2twNYR/Yr+zrBH6JB+Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1107650},"main":"dist/lib.js","_from":"file:motiblog-mcp-0.5.1.tgz","types":"dist/lib.d.ts","//main":"src/lib.ts is the importable surface — pure re-exports. src/index.ts (stdio) and src/http.ts (standalone HTTP) execute on import, so they are run through the scripts below and must never be `main`: the API imports this package in-process.","engines":{"node":">=20"},"mcpName":"ai.motiblog/mcp","scripts":{"dev":"tsx watch src/index.ts","lint":"tsc --noEmit","test":"jest","build":"tsup","clean":"rm -rf dist","start":"tsx src/index.ts","start:http":"tsx src/http.ts"},"_npmUser":{"name":"hsanshine","email":"untilhamza@gmail.com"},"//bin-mcp":"The `mcp` alias is what makes `npx -y @motiblog/mcp` work. npx resolves the bin whose key matches the package's unscoped name; with only motiblog-mcp/-http it fails with 'could not determine executable to run'. Verified against the published 0.1.0 before adding this. Do not remove it.","//mcpName":"Links this npm package to its official MCP Registry entry. The registry refuses to publish a listing that names an npm package which does not point back at it — that pairing is how it proves the same owner controls both. Must equal `name` in server.json.","_resolved":"/private/var/folders/tp/8j9k46495dx_pfz8bttnk2z40000gn/T/ba128ec1ad06707f5fb76340ea8c9fd9/motiblog-mcp-0.5.1.tgz","_integrity":"sha512-slskjmvQsxPjeHF+sy0Z3OGZc/ufPuR+w4HAIKClzdYOoX+0hL3IdzqzaZj79i1iLOPUC0myYyOSHB/PdoUwzg==","repository":{"url":"git+https://github.com/HoverNotes/motiblog.git","type":"git","directory":"apps/mcp"},"_npmVersion":"10.9.4","description":"Agent-first SEO research and publishing: competitors, SERPs, internal links, and Search Console","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.13.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"The workspace consumes raw TypeScript; npm consumers cannot. pnpm swaps these fields into the published manifest, so `main`/`bin` point at the tsup build in the tarball while apps/api keeps resolving src/ in development.","devDependencies":{"tsx":"^4.19.0","jest":"^30.3.0","tsup":"^8","ts-jest":"^29.4.6","typescript":"^5.6.0","@types/jest":"^30.0.0","@types/node":"^22.0.0","@motiblog/shared":"0.0.1"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.5.1_1787894419544_0.8406650463946843","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@motiblog/mcp","version":"0.5.2","keywords":["mcp","model-context-protocol","blog","seo","content","agent","claude","motiblog"],"license":"UNLICENSED","_id":"@motiblog/mcp@0.5.2","maintainers":[{"name":"hsanshine","email":"untilhamza@gmail.com"}],"homepage":"https://motiblog.ai/mcp","bugs":{"url":"https://github.com/HoverNotes/motiblog/issues"},"bin":{"mcp":"dist/index.js","motiblog-mcp":"dist/index.js","motiblog-mcp-http":"dist/http.js"},"dist":{"shasum":"eab5f0ba6dd7ece2df7a98024df66d8e02447312","tarball":"https://registry.npmjs.org/@motiblog/mcp/-/mcp-0.5.2.tgz","fileCount":11,"integrity":"sha512-KXkVr3Gp/jnrb1XC5m8B4xQFl8Ihl9acyecXXrvPjAmrPR8Lt1VVf6fM1jCPdmozabin+da1KQdEav81Bm00aA==","signatures":[{"sig":"MEYCIQDL/+hGW3xcwuzSMps8YAxu38uDdaFzsh9+9NRNSrwUXgIhAI2U/IGakuQ28fDqPZqTSUh+70QZW6czKa1oK0erpNdX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1106498},"main":"dist/lib.js","_from":"file:motiblog-mcp-0.5.2.tgz","types":"dist/lib.d.ts","//main":"src/lib.ts is the importable surface — pure re-exports. src/index.ts (stdio) and src/http.ts (standalone HTTP) execute on import, so they are run through the scripts below and must never be `main`: the API imports this package in-process.","engines":{"node":">=20"},"mcpName":"ai.motiblog/mcp","scripts":{"dev":"tsx watch src/index.ts","lint":"tsc --noEmit","test":"jest","build":"tsup","clean":"rm -rf dist","start":"tsx src/index.ts","start:http":"tsx src/http.ts"},"_npmUser":{"name":"hsanshine","email":"untilhamza@gmail.com"},"//bin-mcp":"The `mcp` alias is what makes `npx -y @motiblog/mcp` work. npx resolves the bin whose key matches the package's unscoped name; with only motiblog-mcp/-http it fails with 'could not determine executable to run'. Verified against the published 0.1.0 before adding this. Do not remove it.","//mcpName":"Links this npm package to its official MCP Registry entry. The registry refuses to publish a listing that names an npm package which does not point back at it — that pairing is how it proves the same owner controls both. Must equal `name` in server.json.","_resolved":"/private/var/folders/tp/8j9k46495dx_pfz8bttnk2z40000gn/T/815095035883a4c6638fceeb3f4d409f/motiblog-mcp-0.5.2.tgz","_integrity":"sha512-KXkVr3Gp/jnrb1XC5m8B4xQFl8Ihl9acyecXXrvPjAmrPR8Lt1VVf6fM1jCPdmozabin+da1KQdEav81Bm00aA==","repository":{"url":"git+https://github.com/HoverNotes/motiblog.git","type":"git","directory":"apps/mcp"},"_npmVersion":"10.9.4","description":"Agent-first SEO research and publishing: competitors, SERPs, internal links, and Search Console","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.13.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"The workspace consumes raw TypeScript; npm consumers cannot. pnpm swaps these fields into the published manifest, so `main`/`bin` point at the tsup build in the tarball while apps/api keeps resolving src/ in development.","devDependencies":{"tsx":"^4.19.0","jest":"^30.3.0","tsup":"^8","ts-jest":"^29.4.6","typescript":"^5.6.0","@types/jest":"^30.0.0","@types/node":"^22.0.0","@motiblog/shared":"0.0.1"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.5.2_1787894638991_0.45769132276699986","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"@motiblog/mcp","version":"0.5.3","keywords":["mcp","model-context-protocol","blog","seo","content","agent","claude","motiblog"],"license":"UNLICENSED","_id":"@motiblog/mcp@0.5.3","maintainers":[{"name":"hsanshine","email":"untilhamza@gmail.com"}],"homepage":"https://motiblog.ai/mcp","bugs":{"url":"https://github.com/HoverNotes/motiblog/issues"},"bin":{"mcp":"dist/index.js","motiblog-mcp":"dist/index.js","motiblog-mcp-http":"dist/http.js"},"dist":{"shasum":"948b62c8911cd21d384b0aff2ee9ed89bebd850c","tarball":"https://registry.npmjs.org/@motiblog/mcp/-/mcp-0.5.3.tgz","fileCount":11,"integrity":"sha512-VBTsBm5df00fIjiAiWbjREHRpkh3FfFkKjoHdevnFI1ocZCubMOYf6n9sjFyF4gZ0x/olO91U7rZU/u2yaTswA==","signatures":[{"sig":"MEYCIQDE3m/YP89uo2nPSQ1zCLSYA2kEd0xor+6vvzk9BdHnzgIhAO56ACQsQzqKfl8NSlOO+u+yKi4lEsNgNb5dQkxMVEiw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1108910},"main":"dist/lib.js","_from":"file:motiblog-mcp-0.5.3.tgz","types":"dist/lib.d.ts","//main":"src/lib.ts is the importable surface — pure re-exports. src/index.ts (stdio) and src/http.ts (standalone HTTP) execute on import, so they are run through the scripts below and must never be `main`: the API imports this package in-process.","engines":{"node":">=20"},"mcpName":"ai.motiblog/mcp","scripts":{"dev":"tsx watch src/index.ts","lint":"tsc --noEmit","test":"jest","build":"tsup","clean":"rm -rf dist","start":"tsx src/index.ts","start:http":"tsx src/http.ts"},"_npmUser":{"name":"hsanshine","email":"untilhamza@gmail.com"},"//bin-mcp":"The `mcp` alias is what makes `npx -y @motiblog/mcp` work. npx resolves the bin whose key matches the package's unscoped name; with only motiblog-mcp/-http it fails with 'could not determine executable to run'. Verified against the published 0.1.0 before adding this. Do not remove it.","//mcpName":"Links this npm package to its official MCP Registry entry. The registry refuses to publish a listing that names an npm package which does not point back at it — that pairing is how it proves the same owner controls both. Must equal `name` in server.json.","_resolved":"/private/var/folders/tp/8j9k46495dx_pfz8bttnk2z40000gn/T/2087779e890d1fdd23373c7980e1a91b/motiblog-mcp-0.5.3.tgz","_integrity":"sha512-VBTsBm5df00fIjiAiWbjREHRpkh3FfFkKjoHdevnFI1ocZCubMOYf6n9sjFyF4gZ0x/olO91U7rZU/u2yaTswA==","repository":{"url":"git+https://github.com/HoverNotes/motiblog.git","type":"git","directory":"apps/mcp"},"_npmVersion":"10.9.4","description":"Agent-first SEO research and publishing: competitors, SERPs, internal links, and Search Console","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.13.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"The workspace consumes raw TypeScript; npm consumers cannot. pnpm swaps these fields into the published manifest, so `main`/`bin` point at the tsup build in the tarball while apps/api keeps resolving src/ in development.","devDependencies":{"tsx":"^4.19.0","jest":"^30.3.0","tsup":"^8","ts-jest":"^29.4.6","typescript":"^5.6.0","@types/jest":"^30.0.0","@types/node":"^22.0.0","@motiblog/shared":"0.0.1"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.5.3_1787896164022_0.3609620665151747","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@motiblog/mcp","version":"0.6.0","//mcpName":"Links this npm package to its official MCP Registry entry. The registry refuses to publish a listing that names an npm package which does not point back at it — that pairing is how it proves the same owner controls both. Must equal `name` in server.json.","mcpName":"ai.motiblog/mcp","description":"Agent-first SEO research and publishing: competitors, SERPs, internal links, and Search Console","license":"UNLICENSED","homepage":"https://motiblog.ai/mcp","repository":{"type":"git","url":"git+https://github.com/HoverNotes/motiblog.git","directory":"apps/mcp"},"bugs":{"url":"https://github.com/HoverNotes/motiblog/issues"},"keywords":["mcp","model-context-protocol","blog","seo","content","agent","claude","motiblog"],"//main":"src/lib.ts is the importable surface — pure re-exports. src/index.ts (stdio) and src/http.ts (standalone HTTP) execute on import, so they are run through the scripts below and must never be `main`: the API imports this package in-process.","main":"dist/lib.js","//publishConfig":"The workspace consumes raw TypeScript; npm consumers cannot. pnpm swaps these fields into the published manifest, so `main`/`bin` point at the tsup build in the tarball while apps/api keeps resolving src/ in development.","//bin-mcp":"The `mcp` alias is what makes `npx -y @motiblog/mcp` work. npx resolves the bin whose key matches the package's unscoped name; with only motiblog-mcp/-http it fails with 'could not determine executable to run'. Verified against the published 0.1.0 before adding this. Do not remove it.","publishConfig":{"access":"public"},"engines":{"node":">=20"},"dependencies":{"@modelcontextprotocol/sdk":"^1.13.0","zod":"^3.24.0"},"devDependencies":{"@types/jest":"^30.0.0","@types/node":"^22.0.0","jest":"^30.3.0","ts-jest":"^29.4.6","tsup":"^8","tsx":"^4.19.0","typescript":"^5.6.0","@motiblog/shared":"0.0.1"},"scripts":{"start":"tsx src/index.ts","start:http":"tsx src/http.ts","dev":"tsx watch src/index.ts","build":"tsup","test":"jest","lint":"tsc --noEmit","clean":"rm -rf dist"},"types":"dist/lib.d.ts","bin":{"mcp":"dist/index.js","motiblog-mcp":"dist/index.js","motiblog-mcp-http":"dist/http.js"},"_id":"@motiblog/mcp@0.6.0","_integrity":"sha512-oPrupNvprKxyHMj+GMuJwHKb91ON33mhnbni+nJn+yDtmd7vqIKUcmSj/ml3RojJpuuJERluTeW37t6BGDcwZw==","_resolved":"/private/var/folders/tp/8j9k46495dx_pfz8bttnk2z40000gn/T/f64ce2202045bf242a8643cbd3be149d/motiblog-mcp-0.6.0.tgz","_from":"file:motiblog-mcp-0.6.0.tgz","_nodeVersion":"22.22.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-oPrupNvprKxyHMj+GMuJwHKb91ON33mhnbni+nJn+yDtmd7vqIKUcmSj/ml3RojJpuuJERluTeW37t6BGDcwZw==","shasum":"964c5d448ef135114c491ed97d951f40ae2739ac","tarball":"https://registry.npmjs.org/@motiblog/mcp/-/mcp-0.6.0.tgz","fileCount":11,"unpackedSize":1165237,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDBX5xxDmyowkwHVQ3joHfr4YwNui+QmKYDiagA+9gwYwIhAIY5P5eEg45s/FH++BfPslEgLMCE349W+e91zXVpARaO"}]},"_npmUser":{"name":"hsanshine","email":"untilhamza@gmail.com"},"directories":{},"maintainers":[{"name":"hsanshine","email":"untilhamza@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp_0.6.0_1787899845743_0.7837623343560383"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-26T03:34:42.031Z","modified":"2026-08-28T06:50:46.083Z","0.1.0":"2026-08-26T03:34:42.341Z","0.1.1":"2026-08-26T03:37:24.443Z","0.1.2":"2026-08-26T04:08:22.476Z","0.1.3":"2026-08-26T04:32:30.058Z","0.2.0":"2026-08-26T08:27:32.257Z","0.3.0":"2026-08-26T15:54:48.760Z","0.3.1":"2026-08-26T16:16:23.203Z","0.3.2":"2026-08-26T16:21:54.299Z","0.3.3":"2026-08-26T17:17:44.446Z","0.3.4":"2026-08-26T17:35:43.270Z","0.3.5":"2026-08-28T03:29:10.443Z","0.5.0":"2026-08-28T05:12:07.459Z","0.5.1":"2026-08-28T05:20:19.717Z","0.5.2":"2026-08-28T05:23:59.141Z","0.5.3":"2026-08-28T05:49:24.180Z","0.6.0":"2026-08-28T06:50:45.911Z"},"bugs":{"url":"https://github.com/HoverNotes/motiblog/issues"},"license":"UNLICENSED","homepage":"https://motiblog.ai/mcp","keywords":["mcp","model-context-protocol","blog","seo","content","agent","claude","motiblog"],"repository":{"type":"git","url":"git+https://github.com/HoverNotes/motiblog.git","directory":"apps/mcp"},"description":"Agent-first SEO research and publishing: competitors, SERPs, internal links, and Search Console","maintainers":[{"name":"hsanshine","email":"untilhamza@gmail.com"}],"readme":"# MotiBlog MCP server\n\nAgent-first control surface over the MotiBlog API ([`docs/product/agent-first-direction.md`](../../docs/product/agent-first-direction.md), Direction B). Any MCP-capable agent — Claude Code, Cursor, Codex — can run a whole blog: propose topics, generate, review fact-check reports, approve through the governed gate, publish to targets, or **export content to deploy into its own codebase**.\n\n## Quick start — hosted (what a customer uses)\n\nThe transport is mounted inside the API process, so the deployed API *is* the\nMCP endpoint. No install, no repository checkout, no separate service:\n\n```bash\n# 1. Get a per-project API key (dashboard: Project → Blog API → copy/rotate)\n# 2. Point any MCP-capable agent at the hosted endpoint:\nclaude mcp add --transport http motiblog https://api.motiblog.ai/mcp \\\n  --header \"x-api-key: <your-key>\"\n```\n\nVerify by hand:\n\n```bash\ncurl -s https://api.motiblog.ai/mcp \\\n  -H 'content-type: application/json' \\\n  -H 'accept: application/json, text/event-stream' \\\n  -H 'x-api-key: <your-key>' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\",\"params\":{}}'\n```\n\n## Quick start — local stdio (development)\n\nRunning from the repository, for work on the tool layer itself:\n\n```bash\nclaude mcp add motiblog \\\n  --env MOTIBLOG_API_KEY=<your-key> \\\n  --env MOTIBLOG_PROJECT_ID=<optional-default-project> \\\n  -- pnpm --filter @motiblog/mcp start\n```\n\nThe package is also published to npm for local stdio use; the hosted endpoint\nis the recommended customer path because OAuth needs no copied project key.\n\nOr use the committed [`.mcp.json`](../../.mcp.json): set `MOTIBLOG_API_KEY` in your environment and start Claude Code in the repo root.\n\n| Env var | Required | Meaning |\n|---|---|---|\n| `MOTIBLOG_API_KEY` | yes | Per-project key (`Project.blogApiKey`). Rotatable from dashboard. |\n| `MOTIBLOG_API_URL` | no | API base URL. Default `http://localhost:3001`. |\n| `MOTIBLOG_PROJECT_ID` | no | Default project; tools still accept explicit `project_id`. |\n\n## Remote agents: streamable HTTP\n\n### How it is served in production\n\nThe handler (`src/http-handler.ts`) is mounted **inside the API process** as\nExpress middleware — `apps/api/src/mcp/mcp.middleware.ts`, registered from\n`apps/api/src/main.ts`. Consequences worth knowing:\n\n- `POST api.motiblog.ai/mcp` works with the ordinary API deploy. There is no\n  second container and no extra reverse-proxy rule — which is exactly why the\n  endpoint was unreachable before: the code existed, the route did not.\n- It is registered with `app.use()` *before* `app.listen()`, so it sits ahead\n  of Nest's router. The global `ValidationPipe` and `TransformInterceptor`\n  never see it; if they did, they would rewrap the JSON-RPC envelope in the\n  API's `{ success, data }` shape and no client could parse it.\n- Nest's body-parser has already drained the request stream by then, so the\n  parsed body is handed to the transport explicitly. Skip that and the\n  transport waits on a stream that will never emit again.\n- Tool calls loop back to the same API over loopback, so an agent's key passes\n  the same guards an external caller meets. Being mounted in-process buys no\n  privileged shortcut. Override the loopback base with `MOTIBLOG_MCP_API_URL`.\n\nCovered by `apps/api/src/mcp/mcp.middleware.spec.ts`, which boots a real Nest\napp with those globals installed and asserts a full handshake survives.\n\n### Standalone server\n\nFor local work, or to serve MCP from somewhere other than the API:\n\n```bash\npnpm --filter @motiblog/mcp start:http\n# → http://127.0.0.1:3021/mcp  (POST, JSON-RPC; stateless)\n```\n\n| Env var | Default | Meaning |\n|---|---|---|\n| `MOTIBLOG_HTTP_PORT` | `3021` | Listen port |\n| `MOTIBLOG_HTTP_HOST` | `127.0.0.1` | Bind host (use `0.0.0.0` behind a proxy) |\n\nEvery request must carry the key (`x-api-key` or `Authorization: Bearer`); requests are authenticated and served independently (stateless — no session affinity).\n\nThe hosted endpoint supports OAuth 2.1 discovery, dynamic client registration,\nPKCE, refresh rotation, and human-selected project access. A person can allow\nall projects, an explicit subset, or only projects the agent creates. Per-project keys\nremain available for automations and local stdio use.\n\n## Publishing to npm\n\nPublished as [`@motiblog/mcp`](https://www.npmjs.com/package/@motiblog/mcp)\nunder the `motiblog` org. Consumers run it with:\n\n```bash\nclaude mcp add motiblog --env MOTIBLOG_API_KEY=<key> -- npx -y @motiblog/mcp\n```\n\nPrerequisites for whoever publishes: membership of the `motiblog` org,\n`npm login`, and **2FA enabled** — npm rejects publishes without it\n(`403 … Two-factor authentication or granular access token with bypass 2fa\nenabled is required`). Either pass `--otp=<code>` or use a granular access\ntoken with *Bypass 2FA* in `~/.npmrc`.\n\nThen, from `apps/mcp`:\n\n```bash\npnpm publish --access public          # runs tsup via prepublishOnly\n```\n\nVerify before you push the button:\n\n```bash\npnpm pack                              # writes motiblog-mcp-<version>.tgz\ntar -tzf motiblog-mcp-*.tgz            # dist/ + README.md, nothing else\ntar -xzOf motiblog-mcp-*.tgz package/package.json | grep -E '\"main\"|\"bin\"'\n```\n\nThree things that must stay true, and all are easy to break:\n\n- **The `mcp` bin alias.** `npx -y @motiblog/mcp` resolves the bin whose key\n  matches the package's *unscoped* name. Published 0.1.0 had only\n  `motiblog-mcp` and `motiblog-mcp-http`, so the obvious command failed with\n  \"could not determine executable to run\" — fixed in 0.1.1 by aliasing `mcp`\n  to the stdio entry. Test the bare `npx -y @motiblog/mcp` after any change to\n  `publishConfig.bin`, not just the long form.\n\n- **`@motiblog/shared` is bundled, not depended on.** It is a workspace\n  package that will never exist on npm, so `tsup.config.ts` lists it under\n  `noExternal` and the manifest keeps it in `devDependencies`. Move it back to\n  `dependencies` and every install resolves fine right up until the first\n  `export_blog` call. `grep -c '@motiblog/shared' dist/*.js` must print 0.\n- **`main` differs between the workspace and the tarball.** The repo consumes\n  raw TypeScript (`src/lib.ts`) because `apps/api` imports this package in\n  process; npm consumers get `dist/lib.js`. `publishConfig` performs that swap\n  at publish time, so neither side needs the other's layout.\n\nSmoke-test the tarball the way a customer meets it:\n\n```bash\nmkdir /tmp/t && cd /tmp/t && npm init -y\nnpm install /path/to/motiblog-mcp-<version>.tgz\nnode -e \"console.log(Object.keys(require('@motiblog/mcp')))\"\nMOTIBLOG_HTTP_PORT=3098 node_modules/.bin/motiblog-mcp-http\n```\n\n## Listing in the official MCP Registry\n\n`server.json` in this directory is the listing, validated against schema\n`2025-12-11`. The registry is the canonical directory since 2026 and downstream\ndirectories and newsletters ingest it, so **one publish propagates** — do this\nbefore filling in any individual directory form.\n\n### The namespace\n\n`server.json` claims `ai.motiblog/mcp` — the reverse-DNS namespace for a domain\nwe own, which is the identity a product should have rather than a personal\nGitHub handle. Claiming it means proving control of `motiblog.ai`.\n\n**The keypair is already generated and the proof is already deployed.** The\npublic half is served from the web app at\n[`/.well-known/mcp-registry-auth`](../web/src/app/.well-known/mcp-registry-auth/route.ts);\nthe private half is at `~/.motiblog/mcp-registry-key` (mode 600, never in the\nrepo, same convention as the agent API key).\n\nHTTP verification was chosen over the DNS TXT record deliberately: it lives in\nthis repository, so the proof is reviewable, versioned and deploys with the app\ninstead of depending on a registrar dashboard nobody remembers the login for.\nThe registry accepts either, with the same key — if you ever prefer DNS, the\nrecord is:\n\n```\nmotiblog.ai.  IN  TXT  \"v=MCPv1; k=ed25519; p=<the same public key>\"\n```\n\n### Publishing\n\n`mcp-publisher` is a Go binary from\n[github.com/modelcontextprotocol/registry releases](https://github.com/modelcontextprotocol/registry/releases)\n(v1.8.1 at time of writing) — it is not on npm.\n\n```bash\ncd apps/mcp\nmcp-publisher login http \\\n  --domain motiblog.ai \\\n  --private-key \"$(cat ~/.motiblog/mcp-registry-key)\"\nmcp-publisher publish\n```\n\nThe web app must be deployed with the well-known route before the login will\nverify — the registry fetches `https://motiblog.ai/.well-known/mcp-registry-auth`\nand checks the signature against it. Confirm it is live first:\n\n```bash\ncurl https://motiblog.ai/.well-known/mcp-registry-auth\n# v=MCPv1; k=ed25519; p=...\n```\n\n**If you rotate the key**, the constant in the route and the DNS record (if one\nexists) must change together. A mismatch fails with a signature error that does\nnot explain itself.\n\n### `mcpName` — the pairing the registry enforces\n\n`package.json` carries `\"mcpName\": \"ai.motiblog/mcp\"`, matching `name` in\n`server.json`. This is not optional decoration: the registry refuses to list a\nserver that names an npm package unless that package points back at the\nlisting, because the pairing is how it proves one owner controls both.\n\nOmit it and publishing fails with:\n\n```\nNPM package '@motiblog/mcp' is missing required 'mcpName' field\n```\n\nSince the check reads the *published* package, a fix means republishing to npm\nfirst, then to the registry. Keep the two names in step.\n\n### Status\n\nLive at `ai.motiblog/mcp`. Confirm with:\n\n```bash\ncurl -s 'https://registry.modelcontextprotocol.io/v0.1/servers?search=motiblog'\n```\n\nValidate before publishing — the registry rejects on schema, and the limits\nare tighter than they look (`description` caps at **100 characters**, which\nthe first draft of ours blew past):\n\n```bash\npython3 - <<'PY'\nimport json, urllib.request, jsonschema\ns = json.load(urllib.request.urlopen(json.load(open('server.json'))['$schema']))\njsonschema.validate(json.load(open('server.json')), s)\nprint('valid')\nPY\n```\n\n**Updating a listing needs a new version.** Bump `version` in both\n`package.json` and `server.json` whenever the copy or the package changes, or\nthe publish is a no-op.\n\n## Entry points\n\n| File | Shape | Use |\n|---|---|---|\n| `src/lib.ts` | pure exports, no side effects | what `main` points at; what the API imports |\n| `src/index.ts` | executes on import | stdio server (`pnpm start`) |\n| `src/http.ts` | executable + import-safe server factory | standalone HTTP server (`pnpm start:http`) |\n\nImport the library surface in production code. `http.ts` is import-safe for\ntransport tests; `index.ts` remains an executable-only entry point.\n\n## The agent loop\n\n```\nlist_projects / create_project → suggest_topics → approve_content_plan → generate_article\n      → list_review_queue → get_article (factCheckReport, seoScore)\n      → update_article (fix flagged claims / supply_product_fact)\n      → approve_publication → publish_to_integration …or… export_blog\n```\n\n`get_pipeline_logs` diagnoses failures; `list_refresh_suggestions` finds decaying published posts worth refreshing; `start_pipeline` runs the fully autonomous crawl→plan→generate loop when you want hands-off operation.\n\n## Tools\n\n### Discovery & system\n| Tool | Notes |\n|---|---|\n| `list_projects` | Projects permitted by the credential + approval/quota settings |\n| `create_project` | Create in an available account slot; restricted OAuth grants automatically receive access |\n| `get_project` | Full pipeline config, positioning inputs |\n| `update_project` | Change approval/autonomy, language/model, positioning, links and banner settings |\n| `start_pipeline` | Autonomous crawl→plan→generate run |\n| `get_pipeline_status` | Run state + steps |\n| `retry_pipeline` | Retry a failed run |\n\n### Topics & planning\n| Tool | Notes |\n|---|---|\n| `suggest_topics` | Add topic(s) to content plan (DRAFT entries) |\n| `list_content_plans` | Plan queue with statuses |\n| `approve_content_plan` | Clear a plan entry for generation |\n| `regenerate_content_plan` | AI-rewrite of a plan entry |\n| `reschedule_content_plan` | Move a plan on the calendar |\n| `create_content_plan` | Add a fully agent-authored plan entry (no AI rewrite) |\n| `update_content_plan` | Edit a plan's title/keyword/summary/type/date, pause via DRAFT |\n| `bulk_reschedule_content_plans` | Reorder up to 100 plans in one transactional call |\n| `delete_content_plan` | Soft-delete ungenerated backlog (restorable) |\n| `restore_content_plan` | Undo a soft delete, status and date intact |\n| `list_deleted_content_plans` | Audit what was deleted, find ids to restore |\n| `generate_article` | Full pipeline from APPROVED plan |\n| `generate_programmatic_articles` | Up to 500 rows through a title template |\n| `get_calendar` | Scheduled entries between two ISO dates |\n\n### Review loop (the governance core)\n| Tool | Notes |\n|---|---|\n| `list_review_queue` | Articles by lifecycle status (default REVIEW) |\n| `get_article` | Full markdown + `factCheckReport`, `topicGate`, seoScore, optional per-phase logs |\n| `get_article_feedback` | Aggregate reader ratings for one article |\n| `update_article` | Edit content/title/meta/status — how agents answer fact-check flags |\n| `approve_publication` | Governed approval gate; `publish_now=true` publishes immediately |\n| `schedule_publication` | Set/clear scheduled publish time |\n\n### Regeneration ops\n| Tool | Notes |\n|---|---|\n| `regenerate_article` | Full rerun (destructive) |\n| `regenerate_chapter` | One section only (safe) |\n| `get_pipeline_logs` | Phase telemetry: status, tokens, USD cost |\n| `list_refresh_suggestions` | GSC-driven decay candidates across permitted projects |\n| `dismiss_refresh_suggestion` | Remove an addressed suggestion from the queue |\n| `rewrite_text` | Inline editor rewrite actions without mutating the article |\n\n### Publishing targets\n| Tool | Notes |\n|---|---|\n| `list_integrations` | WEBHOOK/WORDPRESS/GHOST/WEBFLOW/SHOPIFY/DEVTO/SANITY/CUSTOM_API |\n| `get_integration` | Target state with credentials redacted |\n| `create_integration` | Create any supported provider target |\n| `update_integration` / `delete_integration` | Edit, enable/disable, or remove targets |\n| `create_webhook_integration` | Push target for your own infra; deliveries signed `X-Signature: sha256=HMAC(secret)` |\n| `test_integration` | `ping` or `full` connection test |\n| `publish_to_integration` | APPROVED article → PUBLISHING → PUBLISHED |\n| `retry_publish` | Retry failed attempt |\n| `mark_integration_synced` | Record a verified manual sync in publish history |\n| `list_publish_logs` | Success/failure history with provider errors |\n\n### Agent-supplied knowledge\n| Tool | Notes |\n|---|---|\n| `add_keyword` / `list_keywords` / `update_keyword` / `delete_keyword` | Full keyword lifecycle |\n| `list_competitors` / `add_competitor` / `delete_competitor` | Competitive set management |\n| `list_pillar_clusters` | Pillar/member coverage and publication progress |\n| `supply_product_fact` / `list_product_facts` / `get_product_fact` / `delete_product_fact` | Ground truth enforced by strict fact-checking — supply BEFORE generation |\n\n### Brand, authors, crawling and internal links\n| Tool group | Notes |\n|---|---|\n| `get_brand_voice` / `get_brand_voice_preview` / `refresh_brand_voice` | Inspect and re-extract writing voice |\n| `list_authors` / `get_author` / `create_author` / `update_author` / `delete_author` | Full author profiles |\n| `get_content_source` / `update_content_source` / `detect_content_links` | Sitemap/blog-root/manual internal-link source |\n| `list_content_pages` / `delete_content_page` / `get_content_stats` | Content-intelligence inventory |\n| `start_site_crawl` / `get_crawl_status` / `list_crawled_pages` / `get_crawled_page` / `get_site_analysis` | Website crawling and analysis |\n\n### Banners and images\n| Tool group | Notes |\n|---|---|\n| `upload_article_banner` / `delete_article_banner` | Replace or remove an article banner; pipeline banner generation stays internal |\n| `upload_image` | Import a public HTTPS image into MotiBlog storage |\n| `get_banner_preview` / `suggest_banner_prompt` | Inspect and configure the banner style without exposing raw AI image generation |\n\n### Google Search Console\n| Tool group | Notes |\n|---|---|\n| `get_search_console_status` / `connect_search_console` / `list_search_console_properties` / `select_search_console_property` / `disconnect_search_console` | Connection lifecycle; Google consent remains a human browser step |\n| `sync_search_console` / `get_search_console_date_range` / `get_search_console_performance` | Sync and overview analytics |\n| `list_search_console_queries` / `list_search_console_pages` / `get_article_position_history` | Detailed search performance |\n| `list_search_console_insights` / `dismiss_search_console_insight` / `get_search_console_action_queue` | Agent action loop |\n\n### Account and notifications\n| Tool group | Notes |\n|---|---|\n| `get_account_profile` / `update_account_profile` | Safe identity fields only; no billing, password, email, key, or OAuth-grant changes |\n| `get_account_entitlement` | Read-only plan/allowance state (no payment identifiers; cannot start a purchase) |\n| `list_notifications` / `get_unread_notification_count` / `mark_notification_read` / `mark_all_notifications_read` | Notification inbox |\n\n### Export (deploy it yourself)\n| Tool | Notes |\n|---|---|\n| `export_blog` | Writes `{out_dir}/{slug}/index.md` (+ YAML frontmatter incl. `motiblogArticleId`) and `manifest.json`. Portable GFM: single H1, `<img>`→markdown images, iframes→watch links. Drop into Astro/Next/Jekyll/Hugo/plain git and deploy anywhere. |\n\n## Security model\n\n- The API key authenticates as the **project owner** on every existing route — ownership checks are unchanged; there is no privilege escalation.\n- **Admin routes refuse API keys** (`AdminGuard` rejects machine callers), even if the owner is an admin.\n- Publication always passes the typed approval gate with provenance — MCP adds no bypass.\n- Payment, password/email changes, API-key and OAuth-grant management, and project/account deletion remain human-only.\n- Keys are per-project and rotatable; rotate immediately if exposed.\n- Rate limiting: global ThrottlerGuard applies unchanged.\n\n## Development\n\n```bash\npnpm --filter @motiblog/mcp test   # jest unit tests (client envelope handling, export format)\npnpm --filter @motiblog/mcp lint   # tsc --noEmit\npnpm --filter @motiblog/mcp dev    # tsx watch (restart your MCP client after edits)\n```\n","readmeFilename":"README.md"}