From 18273b0f5382b2aff918a91af9ad7ebe831b91d1 Mon Sep 17 00:00:00 2001 From: Matvey-Kuk Date: Wed, 20 Aug 2025 09:06:43 +0100 Subject: [PATCH] Add MCP Catalog Trust Score badge --- .gitignore 2 | 7 ++ Dockerfile 2 | 37 ++++++++++ LICENSE 2 | 21 ++++++ README 2.md | 102 ++++++++++++++++++++++++++ README.md | 1 + package 2.json | 55 ++++++++++++++ package-lock 2.json | 172 ++++++++++++++++++++++++++++++++++++++++++++ smithery 2.yaml | 13 ++++ tsconfig 2.json | 15 ++++ 9 files changed, 423 insertions(+) create mode 100644 .gitignore 2 create mode 100644 Dockerfile 2 create mode 100644 LICENSE 2 create mode 100644 README 2.md create mode 100644 package 2.json create mode 100644 package-lock 2.json create mode 100644 smithery 2.yaml create mode 100644 tsconfig 2.json diff --git a/.gitignore 2 b/.gitignore 2 new file mode 100644 index 0000000..565ab71 --- /dev/null +++ b/.gitignore 2 @@ -0,0 +1,7 @@ +node_modules/ +build/ +*.log +.env* +PRIVATE_README.md +vscode +.vscode diff --git a/Dockerfile 2 b/Dockerfile 2 new file mode 100644 index 0000000..615059b --- /dev/null +++ b/Dockerfile 2 @@ -0,0 +1,37 @@ +# Generated by https://smithery.ai. See: https://smithery.ai/docs/config#dockerfile +# Use an official Node.js runtime as a parent image +FROM node:18-alpine AS builder + +# Set the working directory in the container +WORKDIR /app + +# Copy the package.json and package-lock.json to the working directory +COPY package.json package-lock.json ./ + +# Install any needed packages specified in package.json +RUN npm install --ignore-scripts + +# Copy the current directory contents into the container at /app +COPY . . + +# Build the app +RUN npm run build + +# Use a smaller node image for the release +FROM node:18-alpine + +# Set the working directory in the container +WORKDIR /app + +# Copy the built files from the builder +COPY --from=builder /app/build ./build +COPY --from=builder /app/package.json ./ + +# Install only production dependencies +RUN npm install --omit=dev + +# Make port 8080 available to the world outside this container +EXPOSE 8080 + +# Run the application +ENTRYPOINT ["node", "build/index.js"] diff --git a/LICENSE 2 b/LICENSE 2 new file mode 100644 index 0000000..8d6ba56 --- /dev/null +++ b/LICENSE 2 @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Alex Andrushevich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README 2.md b/README 2.md new file mode 100644 index 0000000..adcee69 --- /dev/null +++ b/README 2.md @@ -0,0 +1,102 @@ +# Coincap MCP +[![Trust Score](https://archestra.ai/mcp-catalog/api/badge/quality/QuantGeekDev/coincap-mcp)](https://archestra.ai/mcp-catalog/quantgeekdev__coincap-mcp) + +[![smithery badge](https://smithery.ai/badge/coincap-mcp)](https://smithery.ai/server/coincap-mcp) + +## What does this server do? + +Allows you to query crypto information from coincap's public API - no API keys or registration required + +## 🚀 Quick Start + +To get started, add this configuration to your Claude Desktop config file: + +**MacOS**: `~/Library/Application\ Support/Claude/claude_desktop_config.json` +**Windows**: `%APPDATA%/Claude/claude_desktop_config.json` + +```json +{ + "mcpServers": { + "mongodb": { + "command": "npx", + "args": ["coincap-mcp"] + } + } +} +``` + +### Installing via Smithery + +To install Coincap for Claude Desktop automatically via [Smithery](https://smithery.ai/server/coincap-mcp): + +```bash +npx -y @smithery/cli install coincap-mcp --client claude +``` + +### Prerequisites + +- Node.js 18+ +- npx + +Then, launch Claude Desktop and you're ready to go! + +## Sample Prompts + +- What is the price of bitcoin? +- What are the available crypto assets? +- What is the market cap of ethereum? + +## Tools + +#### Bitcoin Price Tool + +Gets price for Bitcoin specifically, it's a simple example of a primitive API call tool + +#### Get Crypto Price Tool + +Gets price for any cryptocurrency available on coincap API. It's a good example of how to get mandatory parameter data for your tool calls + +#### List Assets + +Gets a list of all crypto assets available in coincap API + +## Development - local build + +To build it locally: + +On MacOS: `~/Library/Application Support/Claude/claude_desktop_config.json` +On Windows: `%APPDATA%/Claude/claude_desktop_config.json` + +```json +{ + "mcpServers": { + "coincap-mcp": { + "command": "/path/to/coincap-mcp/build/index.js" + } + } +} +``` + +## Development + +Install dependencies: + +```bash +npm install +``` + +Build the server: + +```bash +npm run build +``` + +For development with auto-rebuild: + +```bash +npm run watch +``` + +## 📜 License + +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. diff --git a/README.md b/README.md index b55f487..ff5f99b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Coincap MCP +[![Trust Score](https://archestra.ai/mcp-catalog/api/badge/quality/QuantGeekDev/coincap-mcp)](https://archestra.ai/mcp-catalog/quantgeekdev__coincap-mcp) [![smithery badge](https://smithery.ai/badge/coincap-mcp)](https://smithery.ai/server/coincap-mcp) ## What does this server do? diff --git a/package 2.json b/package 2.json new file mode 100644 index 0000000..f30201a --- /dev/null +++ b/package 2.json @@ -0,0 +1,55 @@ +{ + "name": "coincap-mcp", + "version": "0.9.3", + "author": { + "name": "Alex Andru", + "email": "alex007d@gmail.com" + }, + "description": "A MCP server to get crypto prices from coincap", + "license": "MIT", + "type": "module", + "bin": { + "coincap-mcp": "build/index.js" + }, + "main": "build/index.js", + "files": [ + "build", + "build/**/*" + ], + "scripts": { + "build": "tsc && node -e \"require('fs').chmodSync('build/index.js', '755')\"", + "prepare": "npm run build", + "watch": "tsc --watch", + "inspector": "npx @modelcontextprotocol/inspector build/index.js", + "prepack": "npm run build" + }, + "keywords": [ + "mcp", + "claude", + "coincap", + "anthropic", + "ai", + "cryptocurrency" + ], + "dependencies": { + "@modelcontextprotocol/sdk": "0.6.0", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/node": "^20.11.24", + "typescript": "^5.3.3" + }, + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "https://github.com/QuantGeekDev/coincap-mcp.git" + }, + "bugs": { + "url": "https://github.com/QuantGeekDev/coincap-mcp/issues" + }, + "engines": { + "node": ">=18" + } +} diff --git a/package-lock 2.json b/package-lock 2.json new file mode 100644 index 0000000..d3be799 --- /dev/null +++ b/package-lock 2.json @@ -0,0 +1,172 @@ +{ + "name": "coincap-mcp", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "coincap-mcp", + "version": "0.1.0", + "dependencies": { + "@modelcontextprotocol/sdk": "0.6.0", + "zod": "^3.23.8" + }, + "bin": { + "coincap-mcp": "build/index.js" + }, + "devDependencies": { + "@types/node": "^20.11.24", + "typescript": "^5.3.3" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-0.6.0.tgz", + "integrity": "sha512-9rsDudGhDtMbvxohPoMMyAUOmEzQsOK+XFchh6gZGqo8sx9sBuZQs+CUttXqa8RZXKDaJRCN2tUtgGof7jRkkw==", + "dependencies": { + "content-type": "^1.0.5", + "raw-body": "^3.0.0", + "zod": "^3.23.8" + } + }, + "node_modules/@types/node": { + "version": "20.17.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.9.tgz", + "integrity": "sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/smithery 2.yaml b/smithery 2.yaml new file mode 100644 index 0000000..282b2e9 --- /dev/null +++ b/smithery 2.yaml @@ -0,0 +1,13 @@ +# Smithery configuration file: https://smithery.ai/docs/config#smitheryyaml + +startCommand: + type: stdio + configSchema: + # JSON Schema defining the configuration options for the MCP. + type: object + required: [] + properties: {} + commandFunction: + # A function that produces the CLI command to start the MCP on stdio. + |- + (config) => ({ command: 'npx', args: ['coincap-mcp'] }) diff --git a/tsconfig 2.json b/tsconfig 2.json new file mode 100644 index 0000000..a14bee0 --- /dev/null +++ b/tsconfig 2.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "Node16", + "moduleResolution": "Node16", + "outDir": "./build", + "rootDir": "./src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules"] +}