Discord bot bridge via FastMCP — guilds, messages, moderation, RAG search, agentic workflow. Local web dashboard. For Cursor / Claude Desktop.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · streamable-http · http counts 2 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
show_guild_channels_card
-
show_guilds_card
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 880854b · analyzer v33 · 1d ago
skills & prompt files 14
- agent-rules sandraschi-discord-mcp-880854b/.cursorrules
- skill sandraschi-discord-mcp-880854b/.opencode/skills/discord-mcp/SKILL.md
- agent-rules sandraschi-discord-mcp-880854b/AGENTS.md
- agent-rules sandraschi-discord-mcp-880854b/CLAUDE.md
- prompt-file sandraschi-discord-mcp-880854b/assets/prompts/system.md
- prompt-file sandraschi-discord-mcp-880854b/assets/prompts/user.md
- prompt-file sandraschi-discord-mcp-880854b/mcpb/assets/prompts/system.md
- prompt-file sandraschi-discord-mcp-880854b/mcpb/assets/prompts/user.md
- skill sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/skills/discord-moderation/SKILL.md
- skill sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/skills/discord-ops/SKILL.md
- skill sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/skills/discord-rag/SKILL.md
- skill sandraschi-discord-mcp-880854b/src/discord_mcp/skills/discord-moderation/SKILL.md
- skill sandraschi-discord-mcp-880854b/src/discord_mcp/skills/discord-ops/SKILL.md
- skill sandraschi-discord-mcp-880854b/src/discord_mcp/skills/discord-rag/SKILL.md
danger signals2
- suspicious endpoint discord.com sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/portmanteau.py :1355
"url": f"https://discord.com/api/webhooks/{wh.get('id')}/{wh.get('token')}", - suspicious endpoint discord.com sandraschi-discord-mcp-880854b/src/discord_mcp/portmanteau.py :1506
"url": f"https://discord.com/api/webhooks/{wh.get('id')}/{wh.get('token')}",
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 128
filesystem 12
- fs sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/rag.py :6
from pathlib import Path - fs sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/rules.py :3
from pathlib import Path - fs sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/scheduler.py :7
from pathlib import Path - fs sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/server.py :11
from pathlib import Path - fs sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/slack_bridge.py :3
from pathlib import Path - fs (weak) sandraschi-discord-mcp-880854b/scripts/cua-smoke.py :47
with open(p) as f: - fs (weak) sandraschi-discord-mcp-880854b/scripts/cua-webapp-test.py :33
from pathlib import Path - fs sandraschi-discord-mcp-880854b/src/discord_mcp/rag.py :6
from pathlib import Path - fs sandraschi-discord-mcp-880854b/src/discord_mcp/rules.py :3
from pathlib import Path - fs sandraschi-discord-mcp-880854b/src/discord_mcp/scheduler.py :7
from pathlib import Path - fs sandraschi-discord-mcp-880854b/src/discord_mcp/server.py :11
from pathlib import Path - fs sandraschi-discord-mcp-880854b/src/discord_mcp/slack_bridge.py :3
from pathlib import Path
shell / exec 4
- shell sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/server.py :20
import subprocess - shell (weak) sandraschi-discord-mcp-880854b/scripts/cua-smoke.py :31
import subprocess - shell (weak) sandraschi-discord-mcp-880854b/scripts/cua-webapp-test.py :27
import subprocess - shell sandraschi-discord-mcp-880854b/src/discord_mcp/server.py :20
import subprocess
network 19
- net sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/agentic.py :689
import httpx - net sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/message_watcher.py :19
import httpx - net sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/portmanteau.py :8
import httpx - net sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/rules.py :77
import httpx - net sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/sampling/discord_sampling_handler.py :22
from urllib.parse import urlparse - net sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/server.py :646
import httpx - net sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/slack_bridge.py :41
import httpx - net (weak) sandraschi-discord-mcp-880854b/scripts/cua-smoke.py :34
import urllib.error - net (weak) sandraschi-discord-mcp-880854b/scripts/cua-webapp-test.py :30
import urllib.error - net sandraschi-discord-mcp-880854b/src/discord_mcp/agentic.py :689
import httpx - net sandraschi-discord-mcp-880854b/src/discord_mcp/message_watcher.py :19
import httpx - net sandraschi-discord-mcp-880854b/src/discord_mcp/portmanteau.py :8
import httpx
show 7 more
- net sandraschi-discord-mcp-880854b/src/discord_mcp/rules.py :77
import httpx - net sandraschi-discord-mcp-880854b/src/discord_mcp/sampling/discord_sampling_handler.py :22
from urllib.parse import urlparse - net sandraschi-discord-mcp-880854b/src/discord_mcp/server.py :646
import httpx - net sandraschi-discord-mcp-880854b/src/discord_mcp/slack_bridge.py :41
import httpx - net (weak) sandraschi-discord-mcp-880854b/tests/helpers.py :5
import httpx - net (weak) sandraschi-discord-mcp-880854b/tests/live/conftest.py :6
import httpx - net (weak) sandraschi-discord-mcp-880854b/tests/test_message_watcher.py :35
with patch("discord_mcp.message_watcher.httpx.AsyncClient") as mock_client:
secrets 6
- secrets sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/agentic.py :753
key = os.getenv("DISCORD_SAMPLING_API_KEY", "").strip() or os.getenv("OPENAI_API_KEY", "").strip() - secrets sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/portmanteau.py :35
os.environ.get("DISCORD_TOKEN") - secrets sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/sampling/discord_sampling_handler.py :45
if os.getenv("DISCORD_SAMPLING_USE_OPENAI_KEY", "").lower() in ("1", "true", "yes"): - secrets sandraschi-discord-mcp-880854b/src/discord_mcp/agentic.py :753
key = os.getenv("DISCORD_SAMPLING_API_KEY", "").strip() or os.getenv("OPENAI_API_KEY", "").strip() - secrets sandraschi-discord-mcp-880854b/src/discord_mcp/portmanteau.py :35
os.environ.get("DISCORD_TOKEN") - secrets sandraschi-discord-mcp-880854b/src/discord_mcp/sampling/discord_sampling_handler.py :45
if os.getenv("DISCORD_SAMPLING_USE_OPENAI_KEY", "").lower() in ("1", "true", "yes"):
database 2
- db sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/scheduler.py :5
import sqlite3 - db sandraschi-discord-mcp-880854b/src/discord_mcp/scheduler.py :5
import sqlite3
tool registrations 4
- show_guilds_card sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/tools/prefab_cards.py :12
- show_guild_channels_card sandraschi-discord-mcp-880854b/mcpb/src/discord_mcp/tools/prefab_cards.py :40
- show_guilds_card sandraschi-discord-mcp-880854b/src/discord_mcp/tools/prefab_cards.py :12
- show_guild_channels_card sandraschi-discord-mcp-880854b/src/discord_mcp/tools/prefab_cards.py :40
declared dependencies 22
- fastmcp@>=3.4.4,<4
- python-dotenv@>=1.0.0
- httpx@>=0.27.0
- pydantic@>=2.0.0
- fastapi@>=0.104.0
- uvicorn@>=0.23.0
- lancedb@>=0.4.0
- sentence-transformers@>=3.0.0
- pyarrow@>=14.0.0
- prefab-ui@>=0.14.0
- websockets@>=12.0
- pytest@>=7.0
show 10 more
- pytest-asyncio@>=0.21
- pytest-cov@>=5.0
- ruff@>=0.16.0,<0.17
- tauri-build@2
- tauri@2
- tauri-plugin-shell@2
- tauri-plugin-fs@2
- tauri-plugin-process@2
- serde@1
- serde_json@1
cursor-plugin 1
- opaque (low) sandraschi-discord-mcp-880854b/.cursor/mcp.json
bundled .cursor/ plugin descriptor (sandraschi-discord-mcp-880854b/.cursor/mcp.json) — presence-detected; review the descriptor