cmskite-mcp 0.1.4 → 0.1.6
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.
- package/README.md +5 -0
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/tools/workspace.js +8 -2
- package/dist/tools/workspace.js.map +1 -1
- package/dist/version.js +40 -0
- package/dist/version.js.map +1 -0
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# cmskite-mcp
|
|
2
2
|
|
|
3
|
+
[CMSKite](https://cmskite.com) is a hosted blog backend: you write posts in a
|
|
4
|
+
dashboard, and your website fetches them over HTTP. This MCP server lets an AI
|
|
5
|
+
assistant do that work for you: create a project, write and publish posts, issue
|
|
6
|
+
API keys, and generate the code that connects your site.
|
|
7
|
+
|
|
3
8
|
An MCP server for CMSKite. It gives an assistant the workspace, project and
|
|
4
9
|
content surface behind one agent token.
|
|
5
10
|
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { createRequire } from 'node:module';
|
|
3
2
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
4
3
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
5
4
|
import { CmsKiteClient } from './client.js';
|
|
@@ -15,8 +14,7 @@ import { allTools, registerTools } from './tools/index.js';
|
|
|
15
14
|
* translator, not a second authorization layer, which is the only arrangement
|
|
16
15
|
* where the two cannot disagree.
|
|
17
16
|
*/
|
|
18
|
-
|
|
19
|
-
const { version } = createRequire(import.meta.url)('../package.json');
|
|
17
|
+
import { VERSION as version, isNewer, latestVersion } from './version.js';
|
|
20
18
|
async function main() {
|
|
21
19
|
const config = readConfig();
|
|
22
20
|
const client = new CmsKiteClient(config);
|
|
@@ -35,6 +33,11 @@ async function main() {
|
|
|
35
33
|
// diagnostic in this process goes to stderr.
|
|
36
34
|
await server.connect(new StdioServerTransport());
|
|
37
35
|
process.stderr.write(`cmskite-mcp ${version} ready: ${allTools.length} tools against ${config.apiUrl}\n`);
|
|
36
|
+
void latestVersion().then((newest) => {
|
|
37
|
+
if (newest && isNewer(newest, version)) {
|
|
38
|
+
process.stderr.write(`cmskite-mcp ${version} is out of date; ${newest} is available. Use cmskite-mcp@latest, or run: npx clear-npx-cache\n`);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
38
41
|
}
|
|
39
42
|
main().catch((err) => {
|
|
40
43
|
process.stderr.write(`cmskite-mcp failed to start: ${err instanceof Error ? err.message : String(err)}\n`);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAE1D;;;;;;;;;GASG;AACH,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEzE,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAA;IAExC,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAC5B;QACE,YAAY,EACV,uFAAuF;YACvF,sFAAsF;YACtF,mFAAmF;YACnF,mFAAmF;YACnF,8EAA8E;YAC9E,sFAAsF;YACtF,4DAA4D;KAC/D,CACF,CAAA;IAED,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;IAEvC,gFAAgF;IAChF,4EAA4E;IAC5E,6CAA6C;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAA;IAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,OAAO,WAAW,QAAQ,CAAC,MAAM,kBAAkB,MAAM,CAAC,MAAM,IAAI,CAAC,CAAA;IACzG,KAAK,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACnC,IAAI,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,OAAO,oBAAoB,MAAM,sEAAsE,CAAC,CAAA;QAC9I,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC1G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|
package/dist/tools/workspace.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { versionReport } from '../version.js';
|
|
1
2
|
import { z } from 'zod';
|
|
2
3
|
import { segment } from '../client.js';
|
|
3
4
|
import { defineTool } from './register.js';
|
|
@@ -16,10 +17,15 @@ export const workspaceTools = [
|
|
|
16
17
|
description: 'The account this token acts as and the workspaces it can see. Call this first in a new ' +
|
|
17
18
|
'conversation: it confirms the token works and names the workspace everything else happens in. ' +
|
|
18
19
|
'`agentGrants` is what THIS TOKEN may do; `permissions` is what its owner may do. A tool ' +
|
|
19
|
-
'works only when both allow it, so read `agentGrants` to know which tools will succeed.'
|
|
20
|
+
'works only when both allow it, so read `agentGrants` to know which tools will succeed. ' +
|
|
21
|
+
'`mcp` says which version of this server is running and whether it is out of date; if ' +
|
|
22
|
+
'`mcp.outdated` is true, tell the person before reporting any bug, because it may already be fixed.',
|
|
20
23
|
input: {},
|
|
21
24
|
readOnly: true,
|
|
22
|
-
run: (client) =>
|
|
25
|
+
run: async (client) => {
|
|
26
|
+
const [me, mcp] = await Promise.all([client.request('/v1/auth/me'), versionReport()]);
|
|
27
|
+
return { ...me, mcp };
|
|
28
|
+
},
|
|
23
29
|
}),
|
|
24
30
|
defineTool({
|
|
25
31
|
name: 'create_workspace',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/tools/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,UAAU,CAAC;QACT,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,yFAAyF;YACzF,gGAAgG;YAChG,0FAA0F;YAC1F,
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/tools/workspace.ts"],"names":[],"mappings":"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"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
/** From package.json, so the handshake reports the version that is actually running. */
|
|
3
|
+
export const VERSION = createRequire(import.meta.url)('../package.json').version;
|
|
4
|
+
/** a > b for plain x.y.z versions. */
|
|
5
|
+
export function isNewer(a, b) {
|
|
6
|
+
const pa = a.split('.').map(Number);
|
|
7
|
+
const pb = b.split('.').map(Number);
|
|
8
|
+
for (let i = 0; i < 3; i++)
|
|
9
|
+
if ((pa[i] ?? 0) !== (pb[i] ?? 0))
|
|
10
|
+
return (pa[i] ?? 0) > (pb[i] ?? 0);
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
let latest = null;
|
|
14
|
+
/**
|
|
15
|
+
* The newest version on npm, asked once per process.
|
|
16
|
+
*
|
|
17
|
+
* A stale npx cache pinned a customer two releases back while they reported
|
|
18
|
+
* bugs that were already fixed. Nothing told them. Never throws and never
|
|
19
|
+
* waits more than two seconds: an offline machine gets null, not an error.
|
|
20
|
+
*/
|
|
21
|
+
export function latestVersion() {
|
|
22
|
+
latest ??= fetch('https://registry.npmjs.org/cmskite-mcp/latest', { signal: AbortSignal.timeout(4000) })
|
|
23
|
+
.then(async (r) => (r.ok ? (await r.json()).version ?? null : null))
|
|
24
|
+
.catch(() => null);
|
|
25
|
+
return latest;
|
|
26
|
+
}
|
|
27
|
+
/** What whoami reports about this server. */
|
|
28
|
+
export async function versionReport() {
|
|
29
|
+
const newest = await latestVersion();
|
|
30
|
+
const outdated = newest !== null && isNewer(newest, VERSION);
|
|
31
|
+
return {
|
|
32
|
+
version: VERSION,
|
|
33
|
+
latest: newest,
|
|
34
|
+
outdated,
|
|
35
|
+
...(outdated && {
|
|
36
|
+
fix: `This is cmskite-mcp ${VERSION}; ${newest} is out. Tell the person: use "npx -y cmskite-mcp@latest" in the MCP config, and if it still starts ${VERSION}, run "npx clear-npx-cache" and restart the client.`,
|
|
37
|
+
}),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,wFAAwF;AACxF,MAAM,CAAC,MAAM,OAAO,GAAI,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAyB,CAAC,OAAO,CAAA;AAEzG,sCAAsC;AACtC,MAAM,UAAU,OAAO,CAAC,CAAS,EAAE,CAAS;IAC1C,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACnC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IACjG,OAAO,KAAK,CAAA;AACd,CAAC;AAED,IAAI,MAAM,GAAkC,IAAI,CAAA;AAEhD;;;;;;GAMG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,KAAK,KAAK,CAAC,+CAA+C,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;SACrG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAA0B,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAC7F,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IACpB,OAAO,MAAM,CAAA;AACf,CAAC;AAED,6CAA6C;AAC7C,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAA;IACpC,MAAM,QAAQ,GAAG,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC5D,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,MAAM,EAAE,MAAM;QACd,QAAQ;QACR,GAAG,CAAC,QAAQ,IAAI;YACd,GAAG,EAAE,uBAAuB,OAAO,KAAK,MAAM,uGAAuG,OAAO,qDAAqD;SAClN,CAAC;KACH,CAAA;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cmskite-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
|
+
"mcpName": "io.github.devicorn/cmskite-mcp",
|
|
4
5
|
"description": "MCP server for CMSKite. Gives an assistant the workspace, project and content surface behind one agent token.",
|
|
5
6
|
"license": "MIT",
|
|
6
7
|
"author": "CMSKite",
|