UNPKG

mcp-package-version

Version:

An MCP server to provide LLMs the latest (stable) version of packages in package.json and requirements.txt files

484 lines (483 loc) 24.6 kB
#!/usr/bin/env node import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from '@modelcontextprotocol/sdk/types.js'; import { NpmHandler } from './handlers/npm.js'; import { PythonHandler } from './handlers/python.js'; import { JavaHandler } from './handlers/java.js'; import { GoHandler } from './handlers/go.js'; import { BedrockHandler } from './handlers/bedrock.js'; import { DockerHandler } from './handlers/docker.js'; import { SwiftHandler } from './handlers/swift.js'; import { GitHubActionsHandler } from './handlers/github-actions.js'; class PackageVersionServer { server; npmHandler; pythonHandler; javaHandler; goHandler; bedrockHandler; dockerHandler; swiftHandler; githubActionsHandler; constructor() { this.server = new Server({ name: 'package-version-server', version: '0.1.0', }, { capabilities: { tools: {}, }, }); this.npmHandler = new NpmHandler(); this.pythonHandler = new PythonHandler(); this.javaHandler = new JavaHandler(); this.goHandler = new GoHandler(); this.bedrockHandler = new BedrockHandler(); this.dockerHandler = new DockerHandler(); this.swiftHandler = new SwiftHandler(); this.githubActionsHandler = new GitHubActionsHandler(); this.setupToolHandlers(); this.server.onerror = (error) => console.error('[MCP Error]', error); process.on('SIGINT', async () => { await this.server.close(); process.exit(0); }); } setupToolHandlers() { this.server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: [ { name: 'check_npm_versions', description: 'Check latest stable versions for npm packages', inputSchema: { type: 'object', properties: { dependencies: { type: 'object', additionalProperties: { type: 'string', }, description: 'Dependencies object from package.json', }, constraints: { type: 'object', additionalProperties: { type: 'object', properties: { majorVersion: { type: 'number', description: 'Limit updates to this major version', }, excludePackage: { type: 'boolean', description: 'Exclude this package from updates', }, }, }, description: 'Optional constraints for specific packages', }, }, required: ['dependencies'], }, }, { name: 'check_python_versions', description: 'Check latest stable versions for Python packages', inputSchema: { type: 'object', properties: { requirements: { type: 'array', items: { type: 'string', }, description: 'Array of requirements from requirements.txt', }, }, required: ['requirements'], }, }, { name: 'check_pyproject_versions', description: 'Check latest stable versions for Python packages in pyproject.toml', inputSchema: { type: 'object', properties: { dependencies: { type: 'object', properties: { dependencies: { type: 'object', additionalProperties: { type: 'string', }, description: 'Project dependencies from pyproject.toml', }, 'optional-dependencies': { type: 'object', additionalProperties: { type: 'object', additionalProperties: { type: 'string', }, }, description: 'Optional dependencies from pyproject.toml', }, 'dev-dependencies': { type: 'object', additionalProperties: { type: 'string', }, description: 'Development dependencies from pyproject.toml', }, }, description: 'Dependencies object from pyproject.toml', }, }, required: ['dependencies'], }, }, { name: 'check_maven_versions', description: 'Check latest stable versions for Java packages in pom.xml', inputSchema: { type: 'object', properties: { dependencies: { type: 'array', items: { type: 'object', properties: { groupId: { type: 'string', description: 'Maven group ID', }, artifactId: { type: 'string', description: 'Maven artifact ID', }, version: { type: 'string', description: 'Current version (optional)', }, scope: { type: 'string', description: 'Dependency scope (e.g., compile, test, provided)', }, }, required: ['groupId', 'artifactId'], }, description: 'Array of Maven dependencies', }, }, required: ['dependencies'], }, }, { name: 'check_gradle_versions', description: 'Check latest stable versions for Java packages in build.gradle', inputSchema: { type: 'object', properties: { dependencies: { type: 'array', items: { type: 'object', properties: { configuration: { type: 'string', description: 'Gradle configuration (e.g., implementation, testImplementation)', }, group: { type: 'string', description: 'Package group', }, name: { type: 'string', description: 'Package name', }, version: { type: 'string', description: 'Current version (optional)', }, }, required: ['configuration', 'group', 'name'], }, description: 'Array of Gradle dependencies', }, }, required: ['dependencies'], }, }, { name: 'check_go_versions', description: 'Check latest stable versions for Go packages in go.mod', inputSchema: { type: 'object', properties: { dependencies: { type: 'object', properties: { module: { type: 'string', description: 'Module name', }, require: { type: 'array', items: { type: 'object', properties: { path: { type: 'string', description: 'Package import path', }, version: { type: 'string', description: 'Current version', }, }, required: ['path'], }, description: 'Required dependencies', }, replace: { type: 'array', items: { type: 'object', properties: { old: { type: 'string', description: 'Original package path', }, new: { type: 'string', description: 'Replacement package path', }, version: { type: 'string', description: 'Current version', }, }, required: ['old', 'new'], }, description: 'Replacement dependencies', }, }, required: ['module'], description: 'Dependencies from go.mod', }, }, required: ['dependencies'], }, }, { name: 'check_bedrock_models', description: 'Search, list, and get information about Amazon Bedrock models', inputSchema: { type: 'object', properties: { action: { type: 'string', enum: ['list', 'search', 'get'], description: 'Action to perform: list all models, search for models, or get a specific model', default: 'list' }, query: { type: 'string', description: 'Search query for model name or ID (used with action: "search")' }, provider: { type: 'string', description: 'Filter by provider name (used with action: "search")' }, region: { type: 'string', description: 'Filter by AWS region (used with action: "search")' }, modelId: { type: 'string', description: 'Model ID to retrieve (used with action: "get")' } } } }, { name: 'get_latest_bedrock_model', description: 'Get the latest Claude Sonnet model from Amazon Bedrock (best for coding tasks)', inputSchema: { type: 'object', properties: {} } }, { name: 'check_docker_tags', description: 'Check available tags for Docker container images from Docker Hub, GitHub Container Registry, or custom registries', inputSchema: { type: 'object', properties: { image: { type: 'string', description: 'Docker image name (e.g., "nginx", "ubuntu", "ghcr.io/owner/repo")' }, registry: { type: 'string', enum: ['dockerhub', 'ghcr', 'custom'], description: 'Registry to check (dockerhub, ghcr, or custom)', default: 'dockerhub' }, customRegistry: { type: 'string', description: 'URL for custom registry (required when registry is "custom")' }, limit: { type: 'number', description: 'Maximum number of tags to return', default: 10 }, filterTags: { type: 'array', items: { type: 'string' }, description: 'Array of regex patterns to filter tags' }, includeDigest: { type: 'boolean', description: 'Include image digest in results', default: false } }, required: ['image'] } }, { name: 'check_swift_versions', description: 'Check latest stable versions for Swift packages in Package.swift', inputSchema: { type: 'object', properties: { dependencies: { type: 'array', items: { type: 'object', properties: { url: { type: 'string', description: 'Package URL (e.g., "https://github.com/apple/swift-argument-parser")' }, version: { type: 'string', description: 'Current version (optional)' }, requirement: { type: 'string', description: 'Version requirement type (e.g., "from", "upToNextMajor", "exact")' } }, required: ['url'] }, description: 'Array of Swift package dependencies' }, constraints: { type: 'object', additionalProperties: { type: 'object', properties: { majorVersion: { type: 'number', description: 'Limit updates to this major version' }, excludePackage: { type: 'boolean', description: 'Exclude this package from updates' } } }, description: 'Optional constraints for specific packages' } }, required: ['dependencies'] } }, { name: 'check_github_actions', description: 'Check latest versions for GitHub Actions', inputSchema: { type: 'object', properties: { actions: { type: 'array', items: { type: 'object', properties: { owner: { type: 'string', description: 'GitHub Action owner (username or organization)' }, repo: { type: 'string', description: 'GitHub Action repository name' }, currentVersion: { type: 'string', description: 'Current version (optional)' } }, required: ['owner', 'repo'] }, description: 'Array of GitHub Actions to check' }, includeDetails: { type: 'boolean', description: 'Include additional details like published date and URL', default: false } }, required: ['actions'] } }, ], })); this.server.setRequestHandler(CallToolRequestSchema, async (request) => { if (!request.params.arguments) { throw new McpError(ErrorCode.InvalidParams, 'Missing arguments'); } switch (request.params.name) { case 'check_npm_versions': return this.npmHandler.getLatestVersion(request.params.arguments); case 'check_python_versions': return this.pythonHandler.getLatestVersionFromRequirements(request.params.arguments); case 'check_pyproject_versions': return this.pythonHandler.getLatestVersion(request.params.arguments); case 'check_maven_versions': return this.javaHandler.getLatestVersionFromMaven(request.params.arguments); case 'check_gradle_versions': return this.javaHandler.getLatestVersion(request.params.arguments); case 'check_go_versions': return this.goHandler.getLatestVersion(request.params.arguments); case 'check_bedrock_models': return this.bedrockHandler.getLatestVersion(request.params.arguments); case 'get_latest_bedrock_model': // Set the action to get_latest_claude_sonnet to use the specialized method return this.bedrockHandler.getLatestVersion({ action: 'get_latest_claude_sonnet' }); case 'check_docker_tags': return this.dockerHandler.getLatestVersion(request.params.arguments); case 'check_swift_versions': return this.swiftHandler.getLatestVersion(request.params.arguments); case 'check_github_actions': return this.githubActionsHandler.getLatestVersion(request.params.arguments); default: throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${request.params.name}`); } }); } async run() { const transport = new StdioServerTransport(); await this.server.connect(transport); console.error('Package Version MCP server running on stdio'); console.error('\u001b[33m**NOTE: As of version 2.0.0, this MCP server will be rewritten in Go, once released please visit https://github.com/sammcj/mcp-package-version for information on the updated command for your MCP client**\u001b[0m'); } } const server = new PackageVersionServer(); server.run().catch(console.error);