diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 8c2c0c4..12cf131 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -4,7 +4,7 @@ - [ ] Agent (`agents/`) - [ ] Hand (`hands/`) -- [ ] Integration (`integrations/`) +- [ ] MCP Server (`mcp/`) - [ ] Skill (`skills/`) - [ ] Plugin (`plugins/`) - [ ] Provider / Model (`providers/`) @@ -42,7 +42,7 @@ - [ ] `[[requires]]` lists external dependencies - [ ] `[[settings]]` provides user-configurable options -### Integrations (if applicable) +### MCP Servers (if applicable) - [ ] `[transport]` config tested locally - [ ] `[[required_env]]` lists all needed variables - [ ] `setup_instructions` are clear for first-time users diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f4d119..3e7eaa2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/). ## [Unreleased] +### Changed + +- `chore: rename integrations/ directory to mcp/ (no content change; every entry is an MCP server template)` + ## [1.0.0] - 2026-03-21 ### Added diff --git a/CODEOWNERS b/CODEOWNERS index b4155da..789c410 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -4,7 +4,7 @@ providers/ @librefang/models agents/ @librefang/agents hands/ @librefang/agents -integrations/ @librefang/integrations +mcp/ @librefang/integrations skills/ @librefang/agents plugins/ @librefang/agents scripts/ @librefang/core diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4e09d40..acdc943 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -77,14 +77,14 @@ default = "true" - [ ] `[[requires]]` sections list any external dependencies (binaries, services) - [ ] `[[settings]]` sections provide user-configurable options where appropriate -## Adding an Integration +## Adding an MCP Server -Create a file `integrations/.toml`: +Create a file `mcp/.toml`: ```toml id = "my-service" name = "My Service" -description = "What this integration provides" +description = "What this MCP server provides" category = "devtools" # devtools | communication | storage | monitoring | data icon = "🔌" tags = ["relevant", "tags"] @@ -107,7 +107,7 @@ setup_instructions = """ """ ``` -### Integration Checklist +### MCP Server Checklist - [ ] `id` matches the filename (without `.toml`) - [ ] `[transport]` section is correct (test the MCP server command locally) diff --git a/Makefile b/Makefile index 4588180..a259fff 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ SHELL := /bin/bash TEMPLATES_DIR := templates AGENTS_DIR := agents HANDS_DIR := hands -INTEGRATIONS_DIR := integrations +INTEGRATIONS_DIR := mcp SKILLS_DIR := skills PLUGINS_DIR := plugins PROVIDERS_DIR := providers diff --git a/README.md b/README.md index 1c334c0..9c6e666 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Community-maintained content registry for [LibreFang](https://github.com/librefang/librefang) — the open-source Agent Operating System. -This repository is the **single source of truth** for all installable content definitions. Anyone can submit a PR to add new agents, hands, integrations, skills, or provider models — no changes to the LibreFang binary required. +This repository is the **single source of truth** for all installable content definitions. Anyone can submit a PR to add new agents, hands, MCP servers, skills, or provider models — no changes to the LibreFang binary required. ## Overview @@ -10,7 +10,7 @@ This repository is the **single source of truth** for all installable content de |------|------:|-------------| | [Hands](#hands) | 14 | User-facing "apps" — agent + tools + settings + dashboard | | [Agents](#agents) | 32 | Autonomous agent definitions with model config and tools | -| [Integrations](#integrations) | 25 | MCP server connections (GitHub, Slack, DBs, etc.) | +| [MCP Servers](#mcp-servers) | 25 | MCP server connections (GitHub, Slack, DBs, etc.) | | [Providers](#providers) | 49 | LLM provider & model metadata with pricing | | [Models](#providers) | 339 | Individual model definitions across all providers | | [Aliases](#aliases) | 70 | Short names mapped to canonical model IDs | @@ -37,10 +37,10 @@ librefang-registry/ │ │ ├── HAND.toml │ │ └── SKILL.md │ └── ... (14 hands) -├── integrations/ # MCP server integration templates +├── mcp/ # MCP server templates │ ├── github.toml │ ├── slack.toml -│ └── ... (25 integrations) +│ └── ... (25 MCP servers) ├── providers/ # LLM provider & model metadata │ ├── anthropic.toml │ ├── openai.toml @@ -161,9 +161,9 @@ tools = ["web_search", "file_read"] **32 built-in agents:** academic-researcher, analyst, architect, assistant, code-reviewer, coder, customer-support, data-scientist, debugger, devops-lead, doc-writer, email-assistant, health-tracker, hello-world, home-automation, legal-assistant, meeting-assistant, ops, orchestrator, personal-finance, planner, recipe-assistant, recruiter, researcher, sales-assistant, security-auditor, social-media, test-engineer, translator, travel-planner, tutor, writer -### Integrations +### MCP Servers -Integration templates define [MCP](https://modelcontextprotocol.io/) server connections with transport configuration, required environment variables, and setup instructions. +MCP server templates define [MCP](https://modelcontextprotocol.io/) server connections with transport configuration, required environment variables, and setup instructions. ```toml id = "github" @@ -180,9 +180,9 @@ name = "GITHUB_PERSONAL_ACCESS_TOKEN" is_secret = true ``` -**25 integrations across 6 categories:** +**25 MCP servers across 6 categories:** -| Category | Integrations | +| Category | MCP Servers | |----------|-------------| | DevTools | bitbucket, github, gitlab, jira, linear, sentry | | Data | elasticsearch, mongodb, postgresql, redis, sqlite | @@ -264,8 +264,8 @@ librefang catalog update # Install a specific hand librefang hand install browser -# Install a specific integration -librefang integration install github +# Install a specific MCP server +librefang mcp install github ``` ### Custom Local Content diff --git a/SECURITY.md b/SECURITY.md index 7bf2894..b78ab73 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -2,11 +2,11 @@ ## Scope -This repository contains TOML content definitions (agents, hands, integrations, skills, plugins, providers). Security concerns include: +This repository contains TOML content definitions (agents, hands, MCP servers, skills, plugins, providers). Security concerns include: - Malicious content in system prompts or descriptions -- Command injection in integration transport commands -- Integration URLs pointing to phishing or malicious sites +- Command injection in MCP server transport commands +- MCP server URLs pointing to phishing or malicious sites - Credential exposure in TOML files ## Reporting a Vulnerability diff --git a/integrations/README.md b/mcp/README.md similarity index 76% rename from integrations/README.md rename to mcp/README.md index c6a5580..558765d 100644 --- a/integrations/README.md +++ b/mcp/README.md @@ -1,23 +1,23 @@ -# Integrations +# MCP Servers -MCP (Model Context Protocol) server integration templates for LibreFang. Each integration connects LibreFang to an external service (GitHub, Slack, databases, etc.). +MCP (Model Context Protocol) server templates for LibreFang. Each entry connects LibreFang to an external service (GitHub, Slack, databases, etc.). ## Structure ``` -integrations/ +mcp/ ├── github.toml ├── slack.toml ├── postgresql.toml └── ... ``` -## Integration TOML Format +## MCP Server TOML Format ```toml id = "service-id" # Must match filename (without .toml) name = "Service Name" -description = "What this integration provides" +description = "What this MCP server provides" category = "devtools" # devtools | communication | storage | monitoring | data icon = "🐙" tags = ["relevant", "tags"] @@ -49,19 +49,19 @@ Step-by-step setup guide for users. """ ``` -## Current Integrations (25) +## Current MCP Servers (25) -| Integration | Category | Service | -|-------------|----------|---------| +| MCP Server | Category | Service | +|------------|----------|---------| | github | devtools | GitHub repos, issues, PRs | | slack | communication | Slack messaging | | notion | productivity | Notion pages and databases | | postgresql | storage | PostgreSQL database | | ... | | See each file for details | -## Adding a New Integration +## Adding a New MCP Server -1. Create `integrations/.toml` +1. Create `mcp/.toml` 2. Ensure `id` matches the filename 3. Test the MCP server command locally 4. Run `python scripts/validate.py` diff --git a/integrations/aws.toml b/mcp/aws.toml similarity index 100% rename from integrations/aws.toml rename to mcp/aws.toml diff --git a/integrations/azure-mcp.toml b/mcp/azure-mcp.toml similarity index 100% rename from integrations/azure-mcp.toml rename to mcp/azure-mcp.toml diff --git a/integrations/bitbucket.toml b/mcp/bitbucket.toml similarity index 100% rename from integrations/bitbucket.toml rename to mcp/bitbucket.toml diff --git a/integrations/brave-search.toml b/mcp/brave-search.toml similarity index 100% rename from integrations/brave-search.toml rename to mcp/brave-search.toml diff --git a/integrations/discord-mcp.toml b/mcp/discord-mcp.toml similarity index 100% rename from integrations/discord-mcp.toml rename to mcp/discord-mcp.toml diff --git a/integrations/dropbox.toml b/mcp/dropbox.toml similarity index 100% rename from integrations/dropbox.toml rename to mcp/dropbox.toml diff --git a/integrations/elasticsearch.toml b/mcp/elasticsearch.toml similarity index 100% rename from integrations/elasticsearch.toml rename to mcp/elasticsearch.toml diff --git a/integrations/exa-search.toml b/mcp/exa-search.toml similarity index 100% rename from integrations/exa-search.toml rename to mcp/exa-search.toml diff --git a/integrations/fetch.toml b/mcp/fetch.toml similarity index 100% rename from integrations/fetch.toml rename to mcp/fetch.toml diff --git a/integrations/filesystem.toml b/mcp/filesystem.toml similarity index 100% rename from integrations/filesystem.toml rename to mcp/filesystem.toml diff --git a/integrations/gcp-mcp.toml b/mcp/gcp-mcp.toml similarity index 100% rename from integrations/gcp-mcp.toml rename to mcp/gcp-mcp.toml diff --git a/integrations/git.toml b/mcp/git.toml similarity index 100% rename from integrations/git.toml rename to mcp/git.toml diff --git a/integrations/github.toml b/mcp/github.toml similarity index 100% rename from integrations/github.toml rename to mcp/github.toml diff --git a/integrations/gitlab.toml b/mcp/gitlab.toml similarity index 100% rename from integrations/gitlab.toml rename to mcp/gitlab.toml diff --git a/integrations/gmail.toml b/mcp/gmail.toml similarity index 100% rename from integrations/gmail.toml rename to mcp/gmail.toml diff --git a/integrations/google-calendar.toml b/mcp/google-calendar.toml similarity index 100% rename from integrations/google-calendar.toml rename to mcp/google-calendar.toml diff --git a/integrations/google-drive.toml b/mcp/google-drive.toml similarity index 100% rename from integrations/google-drive.toml rename to mcp/google-drive.toml diff --git a/integrations/google-maps.toml b/mcp/google-maps.toml similarity index 100% rename from integrations/google-maps.toml rename to mcp/google-maps.toml diff --git a/integrations/jira.toml b/mcp/jira.toml similarity index 100% rename from integrations/jira.toml rename to mcp/jira.toml diff --git a/integrations/linear.toml b/mcp/linear.toml similarity index 100% rename from integrations/linear.toml rename to mcp/linear.toml diff --git a/integrations/memory.toml b/mcp/memory.toml similarity index 100% rename from integrations/memory.toml rename to mcp/memory.toml diff --git a/integrations/mongodb.toml b/mcp/mongodb.toml similarity index 100% rename from integrations/mongodb.toml rename to mcp/mongodb.toml diff --git a/integrations/notion.toml b/mcp/notion.toml similarity index 100% rename from integrations/notion.toml rename to mcp/notion.toml diff --git a/integrations/postgresql.toml b/mcp/postgresql.toml similarity index 100% rename from integrations/postgresql.toml rename to mcp/postgresql.toml diff --git a/integrations/puppeteer.toml b/mcp/puppeteer.toml similarity index 100% rename from integrations/puppeteer.toml rename to mcp/puppeteer.toml diff --git a/integrations/redis.toml b/mcp/redis.toml similarity index 100% rename from integrations/redis.toml rename to mcp/redis.toml diff --git a/integrations/sentry.toml b/mcp/sentry.toml similarity index 100% rename from integrations/sentry.toml rename to mcp/sentry.toml diff --git a/integrations/sequential-thinking.toml b/mcp/sequential-thinking.toml similarity index 100% rename from integrations/sequential-thinking.toml rename to mcp/sequential-thinking.toml diff --git a/integrations/slack.toml b/mcp/slack.toml similarity index 100% rename from integrations/slack.toml rename to mcp/slack.toml diff --git a/integrations/sqlite-mcp.toml b/mcp/sqlite-mcp.toml similarity index 100% rename from integrations/sqlite-mcp.toml rename to mcp/sqlite-mcp.toml diff --git a/integrations/teams-mcp.toml b/mcp/teams-mcp.toml similarity index 100% rename from integrations/teams-mcp.toml rename to mcp/teams-mcp.toml diff --git a/integrations/time.toml b/mcp/time.toml similarity index 100% rename from integrations/time.toml rename to mcp/time.toml diff --git a/integrations/todoist.toml b/mcp/todoist.toml similarity index 100% rename from integrations/todoist.toml rename to mcp/todoist.toml diff --git a/schema.toml b/schema.toml index 3271a60..68f1480 100644 --- a/schema.toml +++ b/schema.toml @@ -604,7 +604,7 @@ default = true [integration] description = "External service integration via MCP server" -file_pattern = "integrations/.toml" +file_pattern = "mcp/.toml" [integration.fields.id] type = "string" diff --git a/scripts/validate.py b/scripts/validate.py index efb69f8..da031e2 100755 --- a/scripts/validate.py +++ b/scripts/validate.py @@ -47,7 +47,7 @@ REQUIRED_MODEL_FIELDS = { "input_cost_per_m", "output_cost_per_m", } -VALID_CONTENT_TYPES = {"providers", "agents", "hands", "integrations", "skills", "plugins", "aliases"} +VALID_CONTENT_TYPES = {"providers", "agents", "hands", "mcp", "skills", "plugins", "aliases"} def load_toml(filepath: Path) -> tuple[dict | None, str | None]: @@ -138,8 +138,8 @@ def validate_hand_file(filepath: Path, integration_ids: set[str]) -> list[str]: Args: filepath: Path to the HAND.toml file. - integration_ids: Set of known integration IDs (filenames without .toml - from the integrations/ directory) for cross-reference validation. + integration_ids: Set of known MCP server IDs (filenames without .toml + from the mcp/ directory) for cross-reference validation. """ data, err = load_toml(filepath) if err: @@ -175,7 +175,7 @@ def validate_hand_file(filepath: Path, integration_ids: set[str]) -> list[str]: if req_key and req_key not in integration_ids: errors.append( f"{rel}: [[requires]] references integration '{req_key}' " - f"but no integrations/{req_key}.toml exists" + f"but no mcp/{req_key}.toml exists" ) return errors @@ -348,11 +348,11 @@ def main(): all_errors = [] stats = {} - # --- Collect integration IDs for cross-reference validation --- - integrations_dir = root / "integrations" + # --- Collect MCP server IDs for cross-reference validation --- + mcp_dir = root / "mcp" integration_ids: set[str] = set() - if integrations_dir.is_dir(): - for fp in integrations_dir.glob("*.toml"): + if mcp_dir.is_dir(): + for fp in mcp_dir.glob("*.toml"): integration_ids.add(fp.stem) # --- Providers --- @@ -410,12 +410,12 @@ def main(): all_errors.append(f"hands/{d.name}: Missing HAND.toml") stats["hands"] = len(hand_dirs) - # --- Integrations --- - if integrations_dir.is_dir() and should_validate("integrations", args.content_type): - int_files = sorted(integrations_dir.glob("*.toml")) + # --- MCP Servers --- + if mcp_dir.is_dir() and should_validate("mcp", args.content_type): + int_files = sorted(mcp_dir.glob("*.toml")) for fp in int_files: all_errors.extend(validate_integration_file(fp)) - stats["integrations"] = len(int_files) + stats["mcp"] = len(int_files) # --- Skills --- skills_dir = root / "skills" @@ -537,7 +537,7 @@ def main(): print() print("Content summary:") - for key in ("providers", "models", "agents", "hands", "integrations", "skills", "plugins"): + for key in ("providers", "models", "agents", "hands", "mcp", "skills", "plugins"): if key in stats: print(f" {key:20s} {stats[key]:>4}") print()