moltbook-http-mcp 1.4.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- "use strict";import{randomUUID as g}from"node:crypto";import{StreamableHTTPServerTransport as h}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as R}from"@modelcontextprotocol/sdk/types.js";import{transports as u}from"./mcp.transports.js";import{createMCPServer as v}from"./mcp.server.js";import{getMoltbookApiKey as b,runWithMoltbookApiKey as I}from"../utils/env.js";import{LOGGER as n}from"../utils/logger.js";const m={};function K(e){const r=e.headers.authorization;if(r?.startsWith("Bearer "))return r.slice(7).trim();const o=e.headers["x-api-key"];if(typeof o=="string")return o.trim();const i=e.query.apiKey;return typeof i=="string"?i.trim():""}export const handleRequest=async(e,r,o)=>{n.log("1.Received MCP request:",e.body);const{jsonrpc:i,id:p,method:l}=e.body;if(i!=="2.0"||!l){r.status(400).json({jsonrpc:"2.0",id:p||null,error:{code:-32600,message:"Invalid Request",data:"Must be valid JSON-RPC 2.0"}});return}const t=e.headers["mcp-session-id"],c=K(e),y=t?m[t]:void 0,f=b(),a=y??(c||f||"");if(!a){r.status(401).json({jsonrpc:"2.0",id:p??null,error:{code:-32001,message:"Missing API key. Send Authorization: Bearer <key>, X-API-Key: <key>, or ?apiKey=<key> in the URL."}});return}await I(a,async()=>{try{let s;if(t&&u[t])n.log(`Session exists: ${t}`),s=u[t];else if(!t&&R(e.body)){s=new h({sessionIdGenerator:()=>g(),enableJsonResponse:!0,onsessioninitialized:d=>{n.log(`Session initialized with ID: ${d}`),u[d]=s,m[d]=a}}),n.log("Connecting to MCP server with CLI params:",o),await v(o).connect(s),await s.handleRequest(e,r,e.body);return}else{r.status(400).json({jsonrpc:"2.0",error:{code:-32e3,message:"Bad Request: No valid session ID provided"},id:null});return}await s.handleRequest(e,r,e.body)}catch(s){n.error("Error handling MCP request:",s),r.headersSent||r.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null})}})};
1
+ "use strict";import{randomUUID as g}from"node:crypto";import{StreamableHTTPServerTransport as h}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as R}from"@modelcontextprotocol/sdk/types.js";import{transports as m}from"./mcp.transports.js";import{createMCPServer as v}from"./mcp.server.js";import{getMoltbookApiKey as b,runWithMoltbookApiKey as I}from"../utils/env.js";import{LOGGER as n}from"../utils/logger.js";const p={};function K(e){const r=e.headers.authorization;if(r?.startsWith("Bearer "))return r.slice(7).trim();const t=e.headers["x-api-key"];if(typeof t=="string")return t.trim();const i=e.query.apiKey;return typeof i=="string"?i.trim():""}export const handleRequest=async(e,r,t)=>{n.log("1.Received MCP request:",{method:e.body?.method,id:e.body?.id});const{jsonrpc:i,id:u,method:l}=e.body;if(i!=="2.0"||!l){r.status(400).json({jsonrpc:"2.0",id:u||null,error:{code:-32600,message:"Invalid Request",data:"Must be valid JSON-RPC 2.0"}});return}const o=e.headers["mcp-session-id"],c=K(e),y=o?p[o]:void 0,f=b(),a=y??(c||f||"");if(!a){r.status(401).json({jsonrpc:"2.0",id:u??null,error:{code:-32001,message:"Missing API key. Send Authorization: Bearer <key>, X-API-Key: <key>, or ?apiKey=<key> in the URL."}});return}await I(a,async()=>{try{let s;if(o&&m[o])n.log(`Session exists: ${o}`),s=m[o];else if(!o&&R(e.body)){s=new h({sessionIdGenerator:()=>g(),enableJsonResponse:!0,onsessioninitialized:d=>{n.log(`Session initialized with ID: ${d}`),m[d]=s,p[d]=a}}),n.log("Connecting to MCP server with CLI params:",t),await v(t).connect(s),await s.handleRequest(e,r,e.body);return}else{r.status(400).json({jsonrpc:"2.0",error:{code:-32e3,message:"Bad Request: No valid session ID provided"},id:null});return}await s.handleRequest(e,r,e.body)}catch(s){n.error("Error handling MCP request:",s?.message||s),r.headersSent||r.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null})}})};
@@ -1 +1 @@
1
- "use strict";import{CallToolRequestSchema as m,ListToolsRequestSchema as u,InitializeRequestSchema as R,LATEST_PROTOCOL_VERSION as p,SUPPORTED_PROTOCOL_VERSIONS as d}from"@modelcontextprotocol/sdk/types.js";import{Server as O}from"@modelcontextprotocol/sdk/server/index.js";import{tools as c}from"./mcp.tools.js";import{MCPMoltbookHandler as v}from"./mcp.moltbook-handler.js";import{LOGGER as n}from"../utils/logger.js";export const createMCPServer=S=>{const l=new v,a={name:"moltbook-mcp-server",version:"1.0.0"},i={capabilities:{resources:{},tools:{}},instructions:"Moltbook MCP server: post, comment, upvote, DMs, and communities. Requires MOLTBOOK_API_KEY (except agent_register)."},t=new O(a,i);return t.setRequestHandler(R,e=>{const o=e.params.protocolVersion,r=d.includes(o)?o:p;return n.log("1. Received InitializeRequest",e,"response:",{protocolVersion:r}),{protocolVersion:r,...i,serverInfo:a}}),t.setRequestHandler(u,async()=>(n.log("2. Received ListToolsRequest",c),{tools:c})),t.setRequestHandler(m,async e=>{const{name:o,arguments:r}=e.params;if(n.log("3. Received CallToolRequestSchema",e.params),!r)return{content:[{type:"text",text:"Error: No arguments provided"}],isError:!0};try{const s=await l.handleRequest(o,r);return{content:[{type:"text",text:JSON.stringify(s,null,2)}]}}catch(s){return n.error("ERROR CallToolRequestSchema",s.message),{content:[{type:"text",text:`Error: ${s.message}`}],isError:!0}}}),t};
1
+ "use strict";import{CallToolRequestSchema as u,ListToolsRequestSchema as R,InitializeRequestSchema as p,LATEST_PROTOCOL_VERSION as d,SUPPORTED_PROTOCOL_VERSIONS as O}from"@modelcontextprotocol/sdk/types.js";import{Server as g}from"@modelcontextprotocol/sdk/server/index.js";import{tools as l}from"./mcp.tools.js";import{MCPMoltbookHandler as S}from"./mcp.moltbook-handler.js";import{LOGGER as s}from"../utils/logger.js";export const createMCPServer=q=>{const m=new S,a={name:"moltbook-mcp-server",version:"1.0.0"},i={capabilities:{resources:{},tools:{}},instructions:"Moltbook MCP server: post, comment, upvote, DMs, and communities. Requires MOLTBOOK_API_KEY (except agent_register)."},t=new g(a,i);return t.setRequestHandler(p,n=>{const e=n.params.protocolVersion,r=O.includes(e)?e:d;return s.log("1. Received InitializeRequest, protocolVersion:",r),{protocolVersion:r,...i,serverInfo:a}}),t.setRequestHandler(R,async()=>(s.log("2. Received ListToolsRequest",l),{tools:l})),t.setRequestHandler(u,async n=>{const{name:e,arguments:r}=n.params;if(s.log("3. Received CallToolRequestSchema:",e),!r)return{content:[{type:"text",text:"Error: No arguments provided"}],isError:!0};try{const o=await m.handleRequest(e,r);return{content:[{type:"text",text:JSON.stringify(o,null,2)}]}}catch(o){const c=o?.message||String(o)||"Unknown error";return s.error(`ERROR CallToolRequestSchema [${e}]:`,c),{content:[{type:"text",text:`Error calling ${e}: ${c}`}],isError:!0}}}),t};
@@ -1 +1 @@
1
- "use strict";import{getMoltbookBase as f,getApiKey as y}from"./moltbook.config.js";async function d(r,t,e={}){const i=f(),g=t.startsWith("http")?t:`${i}${t.startsWith("/")?t:"/"+t}`,u={"Content-Type":"application/json"};e.apiKey!==void 0&&e.apiKey!==null&&(u.Authorization=`Bearer ${e.apiKey}`);const c={method:r||"GET",headers:u};e.body!=null&&(c.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));const s=await fetch(g,c),a=await s.text();let n;try{n=a?JSON.parse(a):null}catch{n={raw:a}}if(!s.ok){const o=new Error(n?.error||n?.message||s.statusText||`HTTP ${s.status}`);throw o.status=s.status,o.data=n,o}return n}async function l(r,t,e,i=!0){const g=f(),u=t.startsWith("http")?t:`${g}${t.startsWith("/")?t:"/"+t}`,c={};i&&(c.Authorization=`Bearer ${y()}`);const s=await fetch(u,{method:r||"POST",headers:c,body:e}),a=await s.text();let n;try{n=a?JSON.parse(a):null}catch{n={raw:a}}if(!s.ok){const o=new Error(n?.error||n?.message||s.statusText||`HTTP ${s.status}`);throw o.status=s.status,o.data=n,o}return n}export async function get(r,t=!0){const e=t?y():void 0;return d("GET",r,{apiKey:e})}export async function post(r,t,e=!0){const i=e?y():void 0;return d("POST",r,{body:t??{},apiKey:i})}export async function patch(r,t){return d("PATCH",r,{body:t,apiKey:y()})}export async function del(r,t){return d("DELETE",r,{apiKey:y(),body:t??void 0})}export async function postForm(r,t){return l("POST",r,t)}
1
+ "use strict";import{getMoltbookBase as T,getApiKey as l}from"./moltbook.config.js";const m=3e4;async function d(r,t,n={}){const i=T(),f=t.startsWith("http")?t:`${i}${t.startsWith("/")?t:"/"+t}`,g={"Content-Type":"application/json"};n.apiKey!==void 0&&n.apiKey!==null&&(g.Authorization=`Bearer ${n.apiKey}`);const c=new AbortController,u=setTimeout(()=>c.abort(),m),y={method:r||"GET",headers:g,signal:c.signal};n.body!=null&&(y.body=typeof n.body=="string"?n.body:JSON.stringify(n.body));let s;try{s=await fetch(f,y)}catch(e){throw clearTimeout(u),e?.name==="AbortError"?new Error(`Request timed out after ${m/1e3}s: ${r} ${t}`):new Error(`Network error: ${e?.message||e} (${r} ${t})`)}clearTimeout(u);const a=await s.text();let o;try{o=a?JSON.parse(a):null}catch{o={raw:a}}if(!s.ok){const e=new Error(o?.error||o?.message||s.statusText||`HTTP ${s.status}`);throw e.status=s.status,e.data=o,e}return o}async function b(r,t,n,i=!0){const f=T(),g=t.startsWith("http")?t:`${f}${t.startsWith("/")?t:"/"+t}`,c={};i&&(c.Authorization=`Bearer ${l()}`);const u=new AbortController,y=setTimeout(()=>u.abort(),m);let s;try{s=await fetch(g,{method:r||"POST",headers:c,body:n,signal:u.signal})}catch(e){throw clearTimeout(y),e?.name==="AbortError"?new Error(`Request timed out after ${m/1e3}s: ${r} ${t}`):new Error(`Network error: ${e?.message||e} (${r} ${t})`)}clearTimeout(y);const a=await s.text();let o;try{o=a?JSON.parse(a):null}catch{o={raw:a}}if(!s.ok){const e=new Error(o?.error||o?.message||s.statusText||`HTTP ${s.status}`);throw e.status=s.status,e.data=o,e}return o}export async function get(r,t=!0){const n=t?l():void 0;return d("GET",r,{apiKey:n})}export async function post(r,t,n=!0){const i=n?l():void 0;return d("POST",r,{body:t??{},apiKey:i})}export async function patch(r,t){return d("PATCH",r,{body:t,apiKey:l()})}export async function del(r,t){return d("DELETE",r,{apiKey:l(),body:t??void 0})}export async function postForm(r,t){return b("POST",r,t)}
@@ -1,2 +1,2 @@
1
1
  "use strict";import{getMcpLogger as a}from"./env.js";const l=(n,t)=>`\x1B]8;;${t}\x07${n}\x1B]8;;\x07`;function o(){const c=(new Error().stack?.split(`
2
- `)||[])[3]||"",e=c.match(/\(([^)]+)\)/),s=e?e[1]:c.trim(),i=s.split("/").pop()||"unknown";return l(`${i}`,`${s}`)}const r=a();export const LOGGER={log:(...n)=>{r&&console.log(`[${o()}]`,...n)},info:(...n)=>{r&&console.info(`[${o()}]`,...n)},warn:(...n)=>{r&&console.warn(`[${o()}]`,...n)},error:(...n)=>{r&&console.error(`[${o()}]`,...n)}};
2
+ `)||[])[3]||"",e=c.match(/\(([^)]+)\)/),s=e?e[1]:c.trim(),i=s.split("/").pop()||"unknown";return l(`${i}`,`${s}`)}const r=a();export const LOGGER={log:(...n)=>{r&&console.log(`[${o()}]`,...n)},info:(...n)=>{r&&console.info(`[${o()}]`,...n)},warn:(...n)=>{r&&console.warn(`[${o()}]`,...n)},error:(...n)=>{console.error(`[${o()}]`,...n)}};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "moltbook-http-mcp",
3
- "version": "1.4.0",
3
+ "version": "1.4.1",
4
4
  "description": "Moltbook MCP server: post, comment, upvote, DMs, communities. API key auth.",
5
5
  "private": false,
6
6
  "mcpName": "io.github.easingthemes/moltbook-mcp",