Initial project setup with MCP SDK skeleton
- TypeScript project with tsup build - MCP server with status, connect, disconnect tools (stubs) - Uses zod for schema validation - Builds and starts successfully 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
commit
db47d8ed10
5 changed files with 2738 additions and 0 deletions
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
node_modules/
|
||||||
|
dist/
|
||||||
|
*.log
|
||||||
|
.DS_Store
|
||||||
2528
package-lock.json
generated
Normal file
2528
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
47
package.json
Normal file
47
package.json
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
{
|
||||||
|
"name": "vice-mcp",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"description": "MCP server for autonomous C64 debugging via VICE emulator",
|
||||||
|
"type": "module",
|
||||||
|
"main": "dist/index.js",
|
||||||
|
"types": "dist/index.d.ts",
|
||||||
|
"bin": {
|
||||||
|
"vice-mcp": "dist/index.js"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsup src/index.ts --format esm --dts --clean",
|
||||||
|
"dev": "tsup src/index.ts --format esm --watch",
|
||||||
|
"start": "node dist/index.js",
|
||||||
|
"typecheck": "tsc --noEmit"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/simen/vice-mcp.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"mcp",
|
||||||
|
"vice",
|
||||||
|
"c64",
|
||||||
|
"commodore",
|
||||||
|
"debugger",
|
||||||
|
"emulator"
|
||||||
|
],
|
||||||
|
"author": "",
|
||||||
|
"license": "MIT",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/simen/vice-mcp/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/simen/vice-mcp#readme",
|
||||||
|
"dependencies": {
|
||||||
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
||||||
|
"zod": "^4.2.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^20.10.0",
|
||||||
|
"tsup": "^8.0.0",
|
||||||
|
"typescript": "^5.3.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
}
|
||||||
|
}
|
||||||
134
src/index.ts
Normal file
134
src/index.ts
Normal file
|
|
@ -0,0 +1,134 @@
|
||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
||||||
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
const server = new McpServer({
|
||||||
|
name: "vice-mcp",
|
||||||
|
version: "0.1.0",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Connection state (will be managed by protocol layer)
|
||||||
|
let connected = false;
|
||||||
|
|
||||||
|
// Tool: status - Get current connection and emulation state
|
||||||
|
server.registerTool(
|
||||||
|
"status",
|
||||||
|
{
|
||||||
|
description: "Get current connection and emulation state",
|
||||||
|
},
|
||||||
|
async () => {
|
||||||
|
return {
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
type: "text",
|
||||||
|
text: JSON.stringify(
|
||||||
|
{
|
||||||
|
connected,
|
||||||
|
running: false,
|
||||||
|
hint: connected
|
||||||
|
? "Connected to VICE"
|
||||||
|
: "Not connected. Use connect() to establish connection to VICE.",
|
||||||
|
},
|
||||||
|
null,
|
||||||
|
2
|
||||||
|
),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// Tool: connect - Connect to a running VICE instance
|
||||||
|
server.registerTool(
|
||||||
|
"connect",
|
||||||
|
{
|
||||||
|
description: "Connect to a running VICE instance with binary monitor enabled",
|
||||||
|
inputSchema: z.object({
|
||||||
|
host: z.string().optional().describe("VICE host address (default: 127.0.0.1)"),
|
||||||
|
port: z.number().optional().describe("VICE binary monitor port (default: 6502)"),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
async (args) => {
|
||||||
|
const host = args.host || "127.0.0.1";
|
||||||
|
const port = args.port || 6502;
|
||||||
|
|
||||||
|
// Placeholder - actual connection logic will be in protocol layer
|
||||||
|
return {
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
type: "text",
|
||||||
|
text: JSON.stringify(
|
||||||
|
{
|
||||||
|
connected: false,
|
||||||
|
error: true,
|
||||||
|
code: "NOT_IMPLEMENTED",
|
||||||
|
message: `Connection to ${host}:${port} not yet implemented`,
|
||||||
|
suggestion:
|
||||||
|
"Protocol layer is under development. Check back soon!",
|
||||||
|
},
|
||||||
|
null,
|
||||||
|
2
|
||||||
|
),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// Tool: disconnect - Disconnect from VICE
|
||||||
|
server.registerTool(
|
||||||
|
"disconnect",
|
||||||
|
{
|
||||||
|
description: "Disconnect from the VICE instance",
|
||||||
|
},
|
||||||
|
async () => {
|
||||||
|
if (!connected) {
|
||||||
|
return {
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
type: "text",
|
||||||
|
text: JSON.stringify(
|
||||||
|
{
|
||||||
|
error: true,
|
||||||
|
code: "NOT_CONNECTED",
|
||||||
|
message: "Not connected to VICE",
|
||||||
|
},
|
||||||
|
null,
|
||||||
|
2
|
||||||
|
),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
connected = false;
|
||||||
|
return {
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
type: "text",
|
||||||
|
text: JSON.stringify(
|
||||||
|
{
|
||||||
|
disconnected: true,
|
||||||
|
message: "Disconnected from VICE",
|
||||||
|
},
|
||||||
|
null,
|
||||||
|
2
|
||||||
|
),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
const transport = new StdioServerTransport();
|
||||||
|
await server.connect(transport);
|
||||||
|
console.error("VICE MCP server started");
|
||||||
|
}
|
||||||
|
|
||||||
|
main().catch((error) => {
|
||||||
|
console.error("Fatal error:", error);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
25
tsconfig.json
Normal file
25
tsconfig.json
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ES2022",
|
||||||
|
"module": "ESNext",
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"lib": ["ES2022"],
|
||||||
|
"outDir": "./dist",
|
||||||
|
"rootDir": "./src",
|
||||||
|
"strict": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"declaration": true,
|
||||||
|
"declarationMap": true,
|
||||||
|
"sourceMap": true,
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"isolatedModules": true,
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"noImplicitReturns": true,
|
||||||
|
"noFallthroughCasesInSwitch": true
|
||||||
|
},
|
||||||
|
"include": ["src/**/*"],
|
||||||
|
"exclude": ["node_modules", "dist"]
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue