Skip to content

Conversation

Matvey-Kuk
Copy link

@Matvey-Kuk Matvey-Kuk commented Aug 20, 2025

Hi!

This PR adds the "Trust Score" badge from our new Open Source MCP catalog.

Our catalog evaluates MCP servers based on technical quality—like protocol feature implementation and dependency health—rather than vanity metrics like GitHub stars.

The scoring process is fully transparent and reproducible:

The badge is designed to be respectful to the structure of your readme, example: Trust Score

Projects like Grafana MCP (https://github.com/grafana/mcp-grafana) are already participating.

We believe that transparent and truly open source MCP catalog should help the community to identify great MCP servers like yours 😊

We'd appreciate your support by merging this PR!

Summary by CodeRabbit

  • New Features

    • Added Docker support to run the app in a container.
    • Introduced a CLI package for easy startup (including npx usage) and a helper script to run the server.
    • Provided an example environment configuration template for quick setup.
    • Added integration config for external runner tooling.
  • Documentation

    • Published a comprehensive README with setup guides for multiple editors/tools, usage examples, and troubleshooting.
    • Added a Trust Score badge to the main README.
  • Chores

    • Updated ignore rules, added TypeScript project config, lockfile, and MIT license.

Copy link

coderabbitai bot commented Aug 20, 2025

Walkthrough

Introduces a Node.js MCP server project scaffold: adds package manifest and lockfile, TypeScript config, Dockerfile, environment example, gitignore, license, documentation, Smithery start config, and two shell scripts for install and runtime. No existing code modified; new files provide build, run, and configuration paths.

Changes

Cohort / File(s) Summary
Project scaffolding and packaging
package 2.json, package-lock 2.json, tsconfig 2.json
Adds npm manifest, lockfile, and TypeScript configuration for a Node.js MCP server with dist/index.js entry and CLI bin.
Containerization
Dockerfile 2
New Dockerfile using node:18-alpine to install, build, and run the app via node dist/index.js.
Runtime and install scripts
install 2.sh, run-server 2.sh
Bash scripts to check prerequisites, install/build, create .env, and start the server loading OCTAGON_API_KEY from env or .env.
Environment and VCS config
.env 2.example, .gitignore 2
Adds example env with Octagon API placeholders and ignore rules for common artifacts and .env.
Smithery integration
smithery 2.yaml
Defines stdio startCommand wiring OCTAGON_API_KEY from config to node dist/index.js.
Documentation
README 2.md, README.md
Adds a detailed README for setup/usage and inserts a Trust Score badge line in the main README.
Licensing
LICENSE 2
Adds MIT license file for the repository.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor User
  participant Shell as run-server 2.sh
  participant FS as Filesystem
  participant Node as Node.js
  participant App as dist/index.js

  User->>Shell: ./run-server\ 2.sh
  alt dist missing
    Shell->>FS: Check dist/
    Shell->>Node: npm run build
    Node-->>Shell: Build artifacts
  end
  Shell->>Shell: Check OCTAGON_API_KEY
  alt not set
    Shell->>FS: Read .env
    Shell->>Shell: export vars
  end
  alt key still missing
    Shell-->>User: Error: set OCTAGON_API_KEY
    Shell->>Shell: exit 1
  else key present
    Shell->>Node: node dist/index.js
    Node->>App: Start server
    App-->>User: MCP server running
  end
Loading
sequenceDiagram
  autonumber
  actor Client as Smithery Runner
  participant Config as smithery 2.yaml
  participant Node as Node.js
  participant App as dist/index.js

  Client->>Config: startCommand(config)
  Config-->>Client: { command: 'node', args: ['dist/index.js'], env: { OCTAGON_API_KEY } }
  Client->>Node: Spawn process with env
  Node->>App: Execute dist/index.js
  App-->>Client: MCP stdio session
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Tip

🔌 Remote MCP (Model Context Protocol) integration is now available!

Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai or `` anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (25)
Dockerfile 2 (3)

1-1: Upgrade to active LTS Node image (Node 18 is EOL).

Using an EOL base image carries avoidable security risk and missed patches. Recommend moving to Node 20 (current LTS) or 22.

Apply:

-FROM node:18-alpine
+FROM node:20-alpine

Optional: pin by digest for supply-chain stability.


9-9: Use npm ci for deterministic, faster installs.

Since you’re copying package-lock.json, prefer npm ci over npm install to ensure reproducible builds and improved performance.

-RUN npm install --ignore-scripts
+RUN npm ci --ignore-scripts

12-18: Harden and slim the image: prune dev deps and drop root.

Two small additions improve security and size without reworking the build:

  • Remove devDependencies after build
  • Run as non-root user
 # Copy source code
 COPY . .
 
 # Build the application
 RUN npm run build
 
+# Remove devDependencies and clean npm cache to reduce image size
+RUN npm prune --omit=dev && npm cache clean --force
+
+# Drop privileges
+# The official Node images provide a 'node' user
+RUN chown -R node:node /app
+USER node
+
 # Run the server
 CMD ["node", "dist/index.js"]

Additionally, add a .dockerignore to avoid bloating the image/context and accidental inclusion of secrets:

# .dockerignore
node_modules
dist
.git
.gitignore
.env
.env.*
!.env.example
npm-debug.log*
README.md (1)

3-4: Nit: Consider placing badges on one line for compactness.

Purely a style/readability tweak; keeps the header area tight.

-[![Trust Score](https://archestra.ai/mcp-catalog/api/badge/quality/OctagonAI/octagon-mcp-server)](https://archestra.ai/mcp-catalog/octagonai__octagon-mcp-server)
-[![smithery badge](https://smithery.ai/badge/@OctagonAI/octagon-mcp-server)](https://smithery.ai/server/@OctagonAI/octagon-mcp-server)
+[![Trust Score](https://archestra.ai/mcp-catalog/api/badge/quality/OctagonAI/octagon-mcp-server)](https://archestra.ai/mcp-catalog/octagonai__octagon-mcp-server) [![smithery badge](https://smithery.ai/badge/@OctagonAI/octagon-mcp-server)](https://smithery.ai/server/@OctagonAI/octagon-mcp-server)
.gitignore 2 (1)

1-5: Tighten ignore patterns and protect env variants.

Use directory-specific patterns and ignore common env variants while keeping the example file tracked.

 .DS_Store
 node_modules
-build
-.env
-dist*
+build/
+.env
+.env.*
+!.env.example
+dist/
tsconfig 2.json (1)

3-12: Optional: improve DX with source maps and stricter CI failure.

Emit source maps for better stack traces and fail builds on TS errors.

   "compilerOptions": {
     "target": "ES2022",
     "module": "NodeNext",
     "moduleResolution": "NodeNext",
     "outDir": "./dist",
     "rootDir": "./src",
     "strict": true,
     "esModuleInterop": true,
     "skipLibCheck": true,
+    "sourceMap": true,
+    "noEmitOnError": true,
     "forceConsistentCasingInFileNames": true
   },
run-server 2.sh (4)

1-1: Enable strict bash options for safer execution

Recommend failing fast and catching unset variables.

Apply this diff:

 #!/bin/bash
+set -Eeuo pipefail
+# If you need to debug:
+# set -x

8-11: Optional: Rebuild when sources change, not only when dist is missing

Only building when ./dist is absent can run stale code if TS sources changed. Consider adding a rebuild flag or a simple timestamp check.

For example:

-if [ ! -d "./dist" ]; then
-    echo "Dist directory not found. Building project..."
-    npm run build
-fi
+if [ ! -d "./dist" ] || [ "$(find src -type f -newer dist 2>/dev/null | wc -l || echo 1)" -gt 0 ]; then
+  echo "Building project..."
+  npm run build
+fi

29-31: Use exec to hand off signals and PID to node

This allows proper signal handling (e.g., SIGTERM) and cleaner shutdown in containers or supervisors.

Apply this diff:

-echo "Running server..."
-node dist/index.js 
+echo "Running server..."
+exec node dist/index.js

1-1: Consider renaming the script to avoid spaces in filename

Spaces in script filenames make CLI usage error-prone. Prefer run-server.sh.

README 2.md (5)

12-21: Tighten grammar and list formatting (“yrs” → “years”; markdownlint MD007)

Minor polish for professionalism and linter compliance.

Apply this diff:

-✅ **Comprehensive Market Intelligence** - Orchestrates multiple specialized agents for complete market analysis
-   - SEC filings analysis and data extraction (8000+ public companies 10-K, 10-Q, 8-K, 20-F, S-1)
-   - Earnings call transcript analysis (10 yrs of historical and current)
-   - Financial metrics and ratios analysis (10 yrs of historical and current)
-   - Stock market data access (over 10,000 active tickers, daily historical and current)
-   - Private company research (3M+ companies)
-   - Funding rounds and venture capital research (500k+ deals)
-   - M&A and IPO transaction research (2M+ deals)
-   - Institutional holdings and Form 13F filings
-   - Cryptocurrency market data and analysis
+✅ **Comprehensive Market Intelligence** — Orchestrates multiple specialized agents for complete market analysis
+- SEC filings analysis and data extraction (8,000+ public companies; 10‑K, 10‑Q, 8‑K, 20‑F, S‑1)
+- Earnings call transcript analysis (10 years of historical and current)
+- Financial metrics and ratios analysis (10 years of historical and current)
+- Stock market data access (10,000+ active tickers; daily historical and current)
+- Private company research (3M+ companies)
+- Funding rounds and venture capital research (500k+ deals)
+- M&A and IPO transaction research (2M+ deals)
+- Institutional holdings and Form 13F filings
+- Cryptocurrency market data and analysis

170-180: Add languages to fenced code blocks (markdownlint MD040)

These are plain-text example prompts; annotate fences to satisfy MD040.

Apply this diff:

-```
+```text
 Retrieve year-over-year growth in key income-statement items for AAPL, limited to 5 records and filtered by period FY
 Analyze the latest 10-K filing for AAPL and extract key financial metrics and risk factors
 ...

```diff
-```
+```text
 Extract all data fields from zillow.com/san-francisco-ca/
 ...

```diff
-```
+```text
 Research the financial impact of Apple's privacy changes on digital advertising companies' revenue and margins
 ...


Also applies to: 188-194, 201-207

---

`226-226`: **Hyphenate compound adjective “rate-limiting”**

Minor grammar fix.

Apply this diff:

```diff
-3. **Rate Limiting**: If you encounter rate limiting errors, reduce the frequency of your requests.
+3. **Rate Limiting**: If you encounter rate-limiting errors, reduce the frequency of your requests.

230-231: Link the license section to the LICENSE file

Improves discoverability.

Apply this diff:

-## License
-
-MIT 
+## License
+
+[MIT](./LICENSE)

83-95: Add a caution about API keys in client configs

Docs embed API keys in config examples. Add a brief note not to commit real keys.

Suggested addition (example placement after each config block):

 ```json
 {
   "mcpServers": {
     "octagon-mcp-server": {
       "command": "npx",
       "args": ["-y", "octagon-mcp@latest"],
       "env": {
         "OCTAGON_API_KEY": "YOUR_API_KEY_HERE"
       }
     }
   }
 }

+Note: Do not commit your real API keys to version control. Use environment variables or secrets managers for production setups.



Also applies to: 123-135, 111-115

</blockquote></details>
<details>
<summary>smithery 2.yaml (2)</summary><blockquote>

`16-16`: **Fix trailing spaces and add newline at EOF (yamllint)**

Lint issues reported: trailing spaces and missing newline at EOF.

Apply this diff:

```diff
-    }) 
+    })
+

3-11: Optional: Extend schema to allow base URL and validate non-empty key

Consider adding an optional octagonApiBaseUrl with a default, and ensure octagonApiKey is non-empty before launching.

Example change:

 configSchema:
   type: object
   required:
     - octagonApiKey
   properties:
     octagonApiKey:
       type: string
       description: Your Octagon API key (get a free one at https://app.octagonai.co/signup)
+    octagonApiBaseUrl:
+      type: string
+      description: Optional API base URL override (defaults to service default)

And in commandFunction:

   env: { OCTAGON_API_KEY: config.octagonApiKey }
+  // Optionally pass through base URL if provided:
+  // env: {
+  //   OCTAGON_API_KEY: config.octagonApiKey,
+  //   ...(config.octagonApiBaseUrl ? { OCTAGON_API_BASE_URL: config.octagonApiBaseUrl } : {})
+  // }
install 2.sh (6)

1-1: Enable strict bash mode for safer installs

Add strict flags to fail fast on errors and catch unset vars.

Apply this diff:

 #!/bin/bash
+set -euo pipefail
+IFS=$'\n\t'

7-17: Also enforce Node.js >= 18 (per engines) instead of only presence

Script checks for node/npm presence but not minimum version. Add a simple version gate.

Apply this diff:

 if ! command -v node &> /dev/null; then
     echo "Node.js is not installed. Please install Node.js before continuing."
     exit 1
 fi

 # Check if npm is installed
 if ! command -v npm &> /dev/null; then
     echo "npm is not installed. Please install npm before continuing."
     exit 1
 fi
+
+# Enforce Node.js >= 18
+NODE_MAJOR="$(node -v | sed -E 's/^v([0-9]+)\..*/\1/')"
+if [ "${NODE_MAJOR}" -lt 18 ]; then
+    echo "Node.js >= 18 is required by this project. Found $(node -v). Please upgrade."
+    exit 1
+fi

20-26: Avoid double-building: npm install already runs prepare → build

package 2.json defines "prepare": "npm run build", so after npm install the project is already built. The extra build here is redundant.

Apply this diff:

 # Install dependencies
 echo "Installing dependencies..."
 npm install

-# Build the server
-echo "Building the server..."
-npm run build
+# Build already runs via package.json `prepare` on install

41-44: Clarify global vs npx usage (they’re different paths)

Using npx does not require a global install; if you do install globally, run the binary directly.

Apply this diff:

-echo "2. Install globally and run with npx:"
+echo "2. Install globally and run the CLI:"
 echo "   npm install -g ."
-echo "   env OCTAGON_API_KEY=your_octagon_api_key npx octagon-mcp"
+echo "   env OCTAGON_API_KEY=your_octagon_api_key octagon-mcp"
+echo ""
+echo "2b. Or run from the npm registry without installing globally (recommended):"
+echo "   env OCTAGON_API_KEY=your_octagon_api_key npx -y octagon-mcp"

45-53: Use a consistent MCP server name (“octagon-mcp”) in client configs

The README/Cursor example uses “octagon-mcp” while the Claude snippet uses “octagon”. Aligning names reduces confusion.

Apply this diff:

 echo "3. To use with Claude Desktop, add the following to your claude_desktop_config.json:"
 echo '{
   "mcpServers": {
-    "octagon": {
+    "octagon-mcp": {
       "command": "env",
       "args": ["OCTAGON_API_KEY=your_octagon_api_key", "npx", "-y", "octagon-mcp"]
     }
   }
 }'

1-1: File name contains a space; consider renaming for portability

Spaces in script filenames cause quoting issues in some environments/tools. Prefer “install.sh”.

If you rename the file, remember to update any docs or references accordingly.

package 2.json (2)

16-24: Build script uses CommonJS require under type:module; consider a simpler/clearer approach

It works because node -e defaults to CJS, but it’s a bit surprising in an ESM package. Two options:

  • Preferred: add a shebang in src/index.ts so the emitted dist/index.js is executable, then drop chmod.
  • Or keep chmod but use ESM style for consistency.

Option A (preferred; assumes you add “#!/usr/bin/env node” to src/index.ts which tsc preserves):

-    "build": "tsc && node -e \"require('fs').chmodSync('dist/index.js', '755')\"",
+    "build": "tsc",

Option B (stay with chmod but ESM):

-    "build": "tsc && node -e \"require('fs').chmodSync('dist/index.js', '755')\"",
+    "build": "tsc && node --input-type=module -e \"import { chmodSync } from 'fs'; chmodSync('dist/index.js', 0o755)\"",

16-24: Consider whether “prepare” is the right hook

“prepare” runs on local install and for git installs, which is fine. It can also make “npm install” slower for contributors. Alternative is “prepack” to build only when publishing. If you keep prepare, remove redundant builds elsewhere (see install 2.sh).

Apply this diff if you prefer building only for publish:

-    "prepare": "npm run build",
+    "prepack": "npm run build",

Note: If you change to prepack, update your contributor workflow to run “npm run build” or “npm run start” locally.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 7f63fce and 912063a.

📒 Files selected for processing (12)
  • .env 2.example (1 hunks)
  • .gitignore 2 (1 hunks)
  • Dockerfile 2 (1 hunks)
  • LICENSE 2 (1 hunks)
  • README 2.md (1 hunks)
  • README.md (1 hunks)
  • install 2.sh (1 hunks)
  • package 2.json (1 hunks)
  • package-lock 2.json (1 hunks)
  • run-server 2.sh (1 hunks)
  • smithery 2.yaml (1 hunks)
  • tsconfig 2.json (1 hunks)
🧰 Additional context used
🪛 Shellcheck (0.10.0)
run-server 2.sh

[warning] 17-17: Quote this to prevent word splitting.

(SC2046)

🪛 LanguageTool
README 2.md

[grammar] ~13-~13: There might be a mistake here.
Context: ...ic companies 10-K, 10-Q, 8-K, 20-F, S-1) - Earnings call transcript analysis (10 yr...

(QB_NEW_EN)


[grammar] ~14-~14: There might be a mistake here.
Context: ...lysis (10 yrs of historical and current) - Financial metrics and ratios analysis (1...

(QB_NEW_EN)


[grammar] ~15-~15: There might be a mistake here.
Context: ...lysis (10 yrs of historical and current) - Stock market data access (over 10,000 ac...

(QB_NEW_EN)


[grammar] ~16-~16: There might be a mistake here.
Context: ...e tickers, daily historical and current) - Private company research (3M+ companies)...

(QB_NEW_EN)


[grammar] ~17-~17: There might be a mistake here.
Context: ...Private company research (3M+ companies) - Funding rounds and venture capital resea...

(QB_NEW_EN)


[grammar] ~18-~18: There might be a mistake here.
Context: ...d venture capital research (500k+ deals) - M&A and IPO transaction research (2M+ de...

(QB_NEW_EN)


[grammar] ~19-~19: There might be a mistake here.
Context: ...and IPO transaction research (2M+ deals) - Institutional holdings and Form 13F fili...

(QB_NEW_EN)


[grammar] ~20-~20: There might be a mistake here.
Context: ...titutional holdings and Form 13F filings - Cryptocurrency market data and analysis ...

(QB_NEW_EN)


[grammar] ~32-~32: There might be a mistake here.
Context: ...gonai.co/api-keys) 2. After logging in, from left menu, navigate to API Keys 3....

(QB_NEW_EN)


[grammar] ~100-~100: There might be a mistake here.
Context: ... Cursor Configuring Cursor Desktop 🖥️ Note: Requires Cursor version 0.45.6+ To...

(QB_NEW_EN)


[grammar] ~101-~101: There might be a mistake here.
Context: ...?️ Note: Requires Cursor version 0.45.6+ To configure Octagon MCP in Cursor: 1. O...

(QB_NEW_EN)


[grammar] ~108-~108: There might be a mistake here.
Context: ... New MCP Server" 4. Enter the following: - Name: "octagon-mcp" (or your preferred n...

(QB_NEW_EN)


[grammar] ~109-~109: There might be a mistake here.
Context: ...: "octagon-mcp" (or your preferred name) - Type: "command" - Command: `env OCTAG...

(QB_NEW_EN)


[grammar] ~110-~110: There might be a mistake here.
Context: ...our preferred name) - Type: "command" - Command: `env OCTAGON_API_KEY=your-octag...

(QB_NEW_EN)


[grammar] ~151-~151: There might be a mistake here.
Context: ...ase visit our official documentation at: [https://docs.octagonagents.com](https:/...

(QB_NEW_EN)


[grammar] ~154-~154: There might be a mistake here.
Context: ...agents.com) The documentation includes: - Detailed API references - Agent-specific...

(QB_NEW_EN)


[grammar] ~155-~155: There might be a mistake here.
Context: ...tion includes: - Detailed API references - Agent-specific query guidelines - Exampl...

(QB_NEW_EN)


[grammar] ~156-~156: There might be a mistake here.
Context: ...rences - Agent-specific query guidelines - Examples and use cases - Best practices ...

(QB_NEW_EN)


[grammar] ~157-~157: There might be a mistake here.
Context: ...uery guidelines - Examples and use cases - Best practices for investment research ...

(QB_NEW_EN)


[style] ~196-~196: Consider a different adjective to strengthen your wording.
Context: ...t that can utilize multiple sources for deep research analysis. Aggregate research a...

(DEEP_PROFOUND)


[grammar] ~216-~216: There might be a mistake here.
Context: ...ields from zillow.com/san-francisco-ca/" 7. "Research the financial impact of Apple'...

(QB_NEW_EN)


[grammar] ~218-~218: There might be a mistake here.
Context: ...e in AI startups in the last 12 months?" 9. "Retrieve historical Bitcoin price data ...

(QB_NEW_EN)


[uncategorized] ~226-~226: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ... 3. Rate Limiting: If you encounter rate limiting errors, reduce the frequency of your re...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


[grammar] ~243-~243: There might be a mistake here.
Context: ...filings ### Private Market Data Servers - **[Octagon Private Companies MCP](https://g...

(QB_NEW_EN)


[grammar] ~244-~244: There might be a mistake here.
Context: ...rivate company research and intelligence - **[Octagon Investors MCP](https://github.co...

(QB_NEW_EN)


[grammar] ~245-~245: There might be a mistake here.
Context: ...estor profiles and investment strategies - **[Octagon Funding Data MCP](https://github...

(QB_NEW_EN)


[grammar] ~248-~248: There might be a mistake here.
Context: ...venture capital data ### Research Tools - **[Octagon Deep Research MCP](https://githu...

(QB_NEW_EN)

🪛 markdownlint-cli2 (0.17.2)
README 2.md

13-13: Unordered list indentation
Expected: 0; Actual: 3

(MD007, ul-indent)


14-14: Unordered list indentation
Expected: 0; Actual: 3

(MD007, ul-indent)


15-15: Unordered list indentation
Expected: 0; Actual: 3

(MD007, ul-indent)


16-16: Unordered list indentation
Expected: 0; Actual: 3

(MD007, ul-indent)


17-17: Unordered list indentation
Expected: 0; Actual: 3

(MD007, ul-indent)


18-18: Unordered list indentation
Expected: 0; Actual: 3

(MD007, ul-indent)


19-19: Unordered list indentation
Expected: 0; Actual: 3

(MD007, ul-indent)


20-20: Unordered list indentation
Expected: 0; Actual: 3

(MD007, ul-indent)


21-21: Unordered list indentation
Expected: 0; Actual: 3

(MD007, ul-indent)


170-170: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


188-188: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


201-201: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🪛 YAMLlint (1.37.1)
smithery 2.yaml

[error] 16-16: no new line character at the end of file

(new-line-at-end-of-file)


[error] 16-16: trailing spaces

(trailing-spaces)

🔇 Additional comments (10)
README.md (1)

3-3: Badge URLs validated – no changes needed.

Both the badge image endpoints (mixed-case OctagonAI and lowercase octagonai) and the target link return HTTP 200 when following redirects. The current paths are correct and will not 404.

.env 2.example (1)

1-5: LGTM: Clear placeholders and defaults.

The example file is concise and aligns with the README instructions.

tsconfig 2.json (1)

3-5: Confirm module system alignment with package.json/runtime.

"module": "NodeNext" expects Node ESM semantics. Ensure package.json sets "type": "module" or that you emit .mjs where needed; otherwise Node will treat dist/*.js as CJS and runtime may fail.

If you intend to ship CJS, switch to "module": "CommonJS". If ESM, confirm "type": "module" exists in package.json.

run-server 2.sh (1)

21-26: Good: clear error message when OCTAGON_API_KEY is missing

The messaging is explicit and actionable.

LICENSE 2 (1)

1-21: MIT license inclusion looks correct

License text and copyright attribution are standard. Matches MIT license declared in package metadata per PR context.

README 2.md (1)

2-2: Trust Score badge and catalog link verified: Both URLs correctly redirect (HTTP 307) to the www.archestra.ai domain and resolve as expected. No changes required.

package-lock 2.json (1)

12-16: Runtime deps look reasonable; engines enforce Node 18+

Nothing blocking here. Lockfile pins modern versions of MCP SDK and OpenAI.

Also applies to: 70-89, 552-591

package 2.json (3)

48-50: Engine constraint is good; surface it earlier in install flow

Node >= 18 is declared here; the installer now checks it too. Good alignment.


37-42: Runtime deps look minimal and reasonable

SDK, dotenv, openai, zod are standard for an MCP server. No issues from this manifest alone.


10-12: Action Required: Verify package tarball contents locally

The dry-run failed (tsc: not found) because the build step wasn’t available in this environment. To confirm which files get published (and ensure your README.md and LICENSE are included), please run locally:

npm install       # install devDependencies (e.g. typescript)
npm run build     # compile into dist/
npm pack --dry-run | sed -n '/^=== Tarball Contents ===/,$p'

Once you’ve inspected the output:

  • If README.md and LICENSE are missing, update your package.json:

       "files": [
    -    "dist"
    +    "dist",
    +    "README.md",
    +    "LICENSE"
       ],
  • Re-run the dry-run to confirm they’re now included.

Comment on lines +27 to +33
# Create .env file if it doesn't exist
if [ ! -f .env ]; then
echo "Creating .env file..."
cp .env.example .env
echo "Please edit the .env file and add your Octagon API key."
fi

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Harden .env creation: check template presence and restrict permissions

Ensure .env.example exists; if not, create a minimal .env. Also set chmod 600 to protect secrets.

Apply this diff:

 # Create .env file if it doesn't exist
 if [ ! -f .env ]; then
     echo "Creating .env file..."
-    cp .env.example .env
-    echo "Please edit the .env file and add your Octagon API key."
+    if [ -f .env.example ]; then
+        cp .env.example .env
+    else
+        printf "OCTAGON_API_KEY=\nOCTAGON_API_BASE_URL=\n" > .env
+    fi
+    chmod 600 .env || true
+    echo "Please edit the .env file and add your Octagon API key (and other values if needed)."
 fi
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# Create .env file if it doesn't exist
if [ ! -f .env ]; then
echo "Creating .env file..."
cp .env.example .env
echo "Please edit the .env file and add your Octagon API key."
fi
# Create .env file if it doesn't exist
if [ ! -f .env ]; then
echo "Creating .env file..."
if [ -f .env.example ]; then
cp .env.example .env
else
printf "OCTAGON_API_KEY=\nOCTAGON_API_BASE_URL=\n" > .env
fi
chmod 600 .env || true
echo "Please edit the .env file and add your Octagon API key (and other values if needed)."
fi
🤖 Prompt for AI Agents
In install 2.sh around lines 27 to 33, the script assumes .env.example exists
and creates .env without restricting permissions; update it to first check for
the existence of .env.example and if present copy it to .env, otherwise create a
minimal .env with at least the OCTAGON_API_KEY placeholder; after creating .env
always set restrictive permissions (chmod 600 .env) and handle copy/create
failures by exiting with a non-zero status so the installer doesn't continue
with missing secrets.

Comment on lines +1 to +28
{
"name": "octagon-mcp",
"version": "1.0.13",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "octagon-mcp",
"version": "1.0.13",
"license": "MIT",
"dependencies": {
"@modelcontextprotocol/sdk": "^1.0.0",
"dotenv": "^16.3.1",
"openai": "^4.20.1",
"zod": "^3.22.4"
},
"bin": {
"octagon-mcp": "dist/index.js"
},
"devDependencies": {
"@types/node": "^20.10.0",
"ts-node": "^10.9.2",
"typescript": "^5.3.2"
},
"engines": {
"node": ">=18.0.0"
}
},
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Verify package.json and package-lock.json versions match

Lockfile shows version 1.0.13; PR context elsewhere references 1.0.22. Mismatched versions can confuse publishing and tagging flows.

Run this script to compare versions and ensure lock consistency:


🏁 Script executed:

#!/bin/bash
set -euo pipefail
if fd -a -g "package*.json" | rg -n "node_modules" >/dev/null 2>&1; then
  echo "Skipping node_modules files"
fi
pkg="$(fd -a -g "package*.json" | rg -v node_modules | rg -nP '/package(\s|\.json)$' -N -o || true)"
# fallback: any package.json at repo root or near-root
if [ -z "${pkg:-}" ]; then
  pkg="$(fd -a -g "package.json" | rg -v node_modules | head -n1)"
fi
echo "package.json path: $pkg"
jq -r '.name,.version' "$pkg"
jq -r '.name,.version' package-lock\ 2.json | head -n2
echo "If versions differ, run: npm install && git add package-lock.json"

Length of output: 387


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Locate package.json and package-lock.json, excluding node_modules
pkg=$(fd -HI -t f -g 'package.json' . | grep -v '^node_modules/' | head -n1)
lock=$(fd -HI -t f -g 'package-lock.json' . | grep -v '^node_modules/' | head -n1)

echo "Using package.json: $pkg"
jq -r '.name + "@" + .version' "$pkg"

echo "Using package-lock.json: $lock"
jq -r '.name + "@" + .version' "$lock"

# If they differ, suggest updating
if [ "$(jq -r .version "$pkg")" != "$(jq -r .version "$lock")" ]; then
  echo ""
  echo "❗ Versions mismatch. To synchronize, run:"
  echo "    npm install"
  echo "    git add package-lock.json"
  exit 1
fi

echo ""
echo "✅ Versions are in sync."

Length of output: 858


Sync package-lock.json version with package.json

The project’s package.json is at version 1.0.22, but package-lock.json remains at 1.0.13. This mismatch will break publishing and tagging flows.

To resolve:

  • Run
    npm install
  • Stage and commit the updated lockfile:
    git add package-lock.json

Files to update:

  • package-lock.json (version field at the top)
🤖 Prompt for AI Agents
In package-lock 2.json around lines 1 to 28, the lockfile's "version" field
(1.0.13) is out of sync with package.json (1.0.22) which will break publishing;
fix by running npm install at the repo root to regenerate/update
package-lock.json so its top-level version matches package.json, then stage and
commit the updated package-lock.json (git add package-lock.json && git commit -m
"chore: sync package-lock with package.json v1.0.22").

Comment on lines +15 to +18
# Try to load from .env file
if [ -f ".env" ]; then
export $(grep -v '^#' .env | xargs)
fi
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix unsafe .env loading (SC2046) and handle spaces/quotes correctly

export $(grep … | xargs) breaks on spaces and special characters and is flagged by shellcheck. Use allexport + source instead.

Apply this diff:

-    if [ -f ".env" ]; then
-        export $(grep -v '^#' .env | xargs)
-    fi
+    if [ -f ".env" ]; then
+        # Load .env safely; allows quoted values and spaces
+        set -a
+        # shellcheck disable=SC1091
+        . ./.env
+        set +a
+    fi
🧰 Tools
🪛 Shellcheck (0.10.0)

[warning] 17-17: Quote this to prevent word splitting.

(SC2046)

🤖 Prompt for AI Agents
In run-server 2.sh around lines 15 to 18, the current pattern using export
$(grep -v '^#' .env | xargs) is unsafe (SC2046) and fails on values with spaces
or quotes; replace it by enabling automatic export, sourcing the .env file, then
disabling automatic export: check if .env exists, run set -a, source the .env
file (so lines are parsed correctly with quotes/spaces preserved), and then run
set +a to restore behavior.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant