portfolio-mcp
Reads a directory of projects and reports on their stack, git state, deployment targets, and monetization readiness.
README
portfolio-mcp
An MCP server that reads a directory full of projects and tells you what is in there: what each one is built with, whether it is in git, where it is deployed, what has gone stale, and which ones are closest to earning money.
It is read-only. It never writes to, moves, or deletes anything it scans.
Install
npx portfolio-mcp --root /path/to/your/projects
Register it with Claude Code:
claude mcp add --scope user portfolio \
-e PORTFOLIO_ROOT=/path/to/your/projects \
-- npx -y portfolio-mcp
Or in any client that reads mcpServers:
{
"mcpServers": {
"portfolio": {
"command": "npx",
"args": ["-y", "portfolio-mcp"],
"env": { "PORTFOLIO_ROOT": "/path/to/your/projects" }
}
}
}
Configuration
Nothing is hardcoded. The scan root is resolved in this order:
--root <path>(or--root=<path>) on the command line- the
PORTFOLIO_ROOTenvironment variable - the process working directory
| Variable | Default | Purpose |
|---|---|---|
PORTFOLIO_ROOT |
working directory | Directory holding the projects to scan |
PORTFOLIO_VPS_HOST |
unset | Hostname or address that marks a self-hosted deployment. While unset, no vps platform is ever reported |
PORTFOLIO_OFFLINE |
unset | Set to 1 to refuse the one tool that reaches package registries |
_archive, _backups, node_modules, .git, and dotted directories are skipped.
Tools
Inventory
| Tool | What it does |
|---|---|
list_projects |
Every project, filterable by stack, deployment status, platform, or GitHub presence |
get_project |
One project in depth: stack, dependencies, git, deployment, readiness, line count |
search_projects |
Match on name, description, framework, dependency, or category |
Deployment
| Tool | What it does |
|---|---|
deployment_map |
Everything grouped by platform: Vercel, Netlify, Railway, Docker, self-hosted, local-only |
check_health |
What deployment configuration one project carries, plus its git state |
git_overview |
Uncommitted work, missing remotes, repos stale past 90 days, directories with no git at all |
Revenue
| Tool | What it does |
|---|---|
revenue_scan |
Scores one project 1 to 10 on auth, payments, landing page, deployment, API, README |
find_opportunities |
Ranks every project, and separates the quick wins |
suggest_actions |
Concrete next steps for one project, in priority order |
learn_patterns |
Aggregate view: preferred frameworks, recurring stacks, strengths |
Maintenance
| Tool | What it does |
|---|---|
outdated_deps |
npm outdated, npm audit, and pip list --outdated for one project |
stale_projects |
Projects sorted by days since the last commit |
What it touches
Being clear about this, because the server reads a directory you care about:
- Reads only. No tool writes, moves, renames, or deletes a file.
- Path containment. A project name is one directory entry. Separators,
.., absolute paths, drive letters, null bytes, and Windows device names are rejected, and the resolved path is then checked to be inside the configured root. There is no way to make it read a sibling directory. - No shell. Every subprocess runs through
execFileSyncwith an argument array. Directory names are never concatenated into a command string. - Subprocesses.
gitfor repository state, andnpm/piponly insideoutdated_deps. - Network.
outdated_depsalone reaches the npm and PyPI registries, because that is whatnpm outdated,npm audit, andpip list --outdateddo. SetPORTFOLIO_OFFLINE=1and it refuses instead. Every other tool is local. - No credentials. The server reads no tokens and sends nothing anywhere.
Scoring
revenue_scan and find_opportunities produce a 1 to 10 score from signals that
are cheap to detect: deployment configuration, an auth library, a payment library,
a landing page entry point, a README, a git remote, an API framework, then a
category multiplier. It is a triage heuristic for sorting a large directory, not a
valuation. Treat the ranking as "look at these first", not as a number that means
anything on its own.
Development
npm ci
npm run build
npm test # builds, then runs node --test
npm pack --dry-run
License
MIT. See LICENSE.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
Neon Database
MCP server for interacting with Neon Management API and databases
E2B
Using MCP to run code via e2b.
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.