A comprehensive MCP-based todo management system, that serves as a central nervous system for Madness Interactive, a multi-project task coordination workshop.
Drift inferred · capture-to-capture
- HIGH code analysis flagged committed secret in MadnessEngineering/Omnispindle
transport stdio · http · sse counts 41 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
add_explanation
-
add_lesson
-
add_todo
-
check_quest
-
complete_todo
-
create_quest
-
delete_lesson
-
delete_todo
-
explain
-
find_relevant
-
get_context_bundle
-
get_lesson
-
get_todo
-
grep_lessons
-
inventorium_sessions_create
-
inventorium_sessions_fork
-
inventorium_sessions_genealogy
-
inventorium_sessions_get
-
inventorium_sessions_list
-
inventorium_sessions_spawn
-
inventorium_sessions_tree
-
inventorium_todos_link_session
-
link_quest
-
link_todos
-
list_lessons
-
list_project_todos
-
list_quests
-
list_todos_by_status
-
point_out_obvious
-
preflight_rag
-
query_todo_logs
-
query_todos
-
query_todos_near
-
read_agent_journal
-
regenerate_embedding
-
search_lessons
-
search_todos
-
update_lesson
-
update_quest
-
update_todo
-
write_agent_journal
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 7a5bdb1 · analyzer v33 · 2w ago
skills & prompt files 3
danger signals1
- suspicious endpoint 169.254.169.254 (cloud metadata) MadnessEngineering-Omnispindle-7a5bdb1/scripts/host_watch.py :481
"http://169.254.169.254/latest/api/token",
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 89
filesystem 15
- fs (weak) MadnessEngineering-Omnispindle-7a5bdb1/scripts/host_watch.py :50
import shutil - fs MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/__main__.py :8
import shutil - fs MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/auth_flow.py :7
from pathlib import Path - fs MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/auth_setup.py :143
with open(output_path, 'w') as f: - fs MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/git_integration.py :10
from pathlib import Path - fs MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/mqtt.py :3
import shutil - fs MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/server.py :6
import shutil - fs MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/token_exchange.py :18
from pathlib import Path - fs MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/tools.py :2722
os.unlink(temp_file) - fs MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/utils.py :130
with open(flow_path, 'r') as file: - fs MadnessEngineering-Omnispindle-7a5bdb1/test_api_client.py :9
from pathlib import Path - fs (weak) MadnessEngineering-Omnispindle-7a5bdb1/tests/test_add_todo_direct.py :7
from pathlib import Path - fs (weak) MadnessEngineering-Omnispindle-7a5bdb1/tests/test_auth_flow.py :7
from pathlib import Path - fs (weak) MadnessEngineering-Omnispindle-7a5bdb1/tests/test_http_server_bindings.py :14
from pathlib import Path - fs (weak) MadnessEngineering-Omnispindle-7a5bdb1/tests/test_user_identity.py :3
from pathlib import Path
shell / exec 8
- shell (weak) MadnessEngineering-Omnispindle-7a5bdb1/scripts/host_watch.py :52
import subprocess - shell MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/__main__.py :9
import subprocess - shell MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/git_integration.py :8
import subprocess - shell MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/mqtt.py :2
import subprocess - shell MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/server.py :7
import subprocess - shell MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/tools.py :5
import subprocess - shell MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/utils.py :5
import subprocess - shell (weak) MadnessEngineering-Omnispindle-7a5bdb1/tests/test_git_integration.py :13
import subprocess
network 10
- net (weak) MadnessEngineering-Omnispindle-7a5bdb1/scripts/host_watch.py :55
import urllib.request - net MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/api_client.py :4
import aiohttp - net MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/auth.py :13
import httpx - net MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/auth_setup.py :15
import urllib.parse - net MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/auth_utils.py :6
import httpx - net MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/embeddings.py :17
import httpx - net MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/token_exchange.py :17
import httpx - net MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/verify_token.py :2
from urllib.request import urlopen - net (weak) MadnessEngineering-Omnispindle-7a5bdb1/tests/test_auth_flow.py :8
import requests - net (weak) MadnessEngineering-Omnispindle-7a5bdb1/tests/test_user_identity.py :4
import requests
secrets 6
- secrets MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/api_client.py :30
self.auth_token = auth_token or os.getenv("MADNESS_AUTH_TOKEN") - secrets MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/auth_flow.py :134
os.environ['AUTH0_TOKEN'] = token - secrets MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/embeddings.py :22
GEMINI_API_KEY = os.getenv("GEMINI_API_KEY") - secrets MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/stdio_server.py :91
auth0_token = os.getenv("AUTH0_TOKEN") - secrets MadnessEngineering-Omnispindle-7a5bdb1/test_api_client.py :24
auth_token = os.getenv("MADNESS_AUTH_TOKEN") - secrets (weak) MadnessEngineering-Omnispindle-7a5bdb1/tests/test_auth_flow.py :101
self.assertEqual(os.environ['AUTH0_TOKEN'], test_token)
database 13
- db MadnessEngineering-Omnispindle-7a5bdb1/migration_scripts/migrate_todo_schema.py :31
from pymongo import MongoClient - db (weak) MadnessEngineering-Omnispindle-7a5bdb1/scripts/backfill_embeddings.py :24
from pymongo import MongoClient - db (weak) MadnessEngineering-Omnispindle-7a5bdb1/scripts/dedupe_todo_logs.py :16
from pymongo import MongoClient - db (weak) MadnessEngineering-Omnispindle-7a5bdb1/scripts/lesson_refiner.py :33
from pymongo import MongoClient - db MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/ai_assistant.py :17
from pymongo import MongoClient - db MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/context.py :3
from pymongo import MongoClient - db MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/database.py :4
from pymongo import MongoClient - db MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/scheduler.py :20
from pymongo import MongoClient - db MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/todo_log_service.py :21
import pymongo - db MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/tools.py :16
from pymongo import MongoClient - db (weak) MadnessEngineering-Omnispindle-7a5bdb1/tests/test_db_collections.py :3
from pymongo import MongoClient - db (weak) MadnessEngineering-Omnispindle-7a5bdb1/tests/test_search.py :11
from pymongo import MongoClient - db (weak) MadnessEngineering-Omnispindle-7a5bdb1/tests/test_todo_handler.py :19
from pymongo import MongoClient
tool registrations 41
- add_todo MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :209
- query_todos MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :220
- get_todo MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :227
- complete_todo MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :234
- update_todo MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :241
- list_todos_by_status MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :252
- list_project_todos MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :259
- delete_todo MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :267
- search_todos MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :274
- add_lesson MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :282
- get_lesson MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :289
- update_lesson MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :296
- delete_lesson MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :303
- regenerate_embedding MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :310
- search_lessons MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :317
- grep_lessons MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :324
- list_lessons MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :331
- query_todo_logs MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :339
- explain MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :346
- add_explanation MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :353
- point_out_obvious MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :360
- inventorium_sessions_list MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :368
- inventorium_sessions_get MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :375
- inventorium_sessions_create MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :382
- inventorium_sessions_spawn MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :389
- inventorium_sessions_fork MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :396
- inventorium_sessions_genealogy MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :403
- inventorium_sessions_tree MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :410
- inventorium_todos_link_session MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :417
- create_quest MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :425
- check_quest MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :432
- list_quests MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :439
- link_quest MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :446
- update_quest MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :453
- query_todos_near MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :461
- link_todos MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :468
- get_context_bundle MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :476
- find_relevant MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :483
- preflight_rag MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :490
- write_agent_journal MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :497
- read_agent_journal MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/http_server.py :504
declared dependencies 17
- fastmcp@==2.2.8
- pymongo@>=4.0.0
- paho-mqtt@>=2.0.0
- python-dotenv@>=0.19.0
- uvicorn@>=0.17.0
- starlette@>=0.17.1
- numpy@>=1.20.0
- python-dateutil@>=2.8.2
- python-jose@>=3.3.0
- httpx@>=0.23.0
- pytest@>=7.0.0
- pytest-asyncio@>=0.21.0
- black@>=22.0.0
- isort@>=5.10.0
- mypy@>=1.0.0
- lmstudio@*
- scikit-learn@>=1.0.0
transport_posture 3
- network-listening, binds all interfaces, no auth detected MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/__main__.py :90
host = "0.0.0.0" # Force binding to all interfaces - network-listening, binds all interfaces, no auth detected MadnessEngineering-Omnispindle-7a5bdb1/src/Omnispindle/stdio_http_server.py :65
host = "0.0.0.0" - network-listening, binds all interfaces, no auth detected MadnessEngineering-Omnispindle-7a5bdb1/src/start_uvicorn.py :34
host = "0.0.0.0"