Production-grade multi-agent workflow orchestrator built with LangGraph, MCP (Model Context Protocol), A2A protocol, and PostgreSQL+pgvector. Features supervisor hub-and-spoke routing, human-in-the-loop approvals, semantic memory, circuit breakers, LLM-as-judge evaluation, and a real-time Streamlit observability dashboard.
Drift inferred · capture-to-capture
- HIGH code analysis flagged committed secret in JoelJohnsonThomas/ForgeFlow
transport stdio · streamable-http counts 63 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
create_lead
-
describe_image
-
draft_email
-
extract_pdf
-
fetch_enrichment
-
get_lead
-
github_close_issue
-
github_comment_issue
-
github_create_issue
-
github_get_repo
-
github_review_pr
-
github_search_issues
-
hubspot_add_note
-
hubspot_create_company
-
hubspot_create_contact
-
hubspot_create_deal
-
hubspot_create_deal_idempotent
-
hubspot_search_contacts
-
hubspot_update_deal_stage
-
hubspot_upsert_company
-
hubspot_upsert_contact
-
jira_comment_issue
-
jira_create_issue
-
jira_get_issue
-
jira_search
-
jira_transition_issue
-
msgraph_create_event
-
msgraph_get_user
-
msgraph_list_messages
-
msgraph_post_adaptive_card
-
msgraph_post_teams_chat
-
msgraph_post_teams_message
-
msgraph_send_mail
-
query_db
-
quickbooks_create_customer
-
quickbooks_create_invoice
-
quickbooks_create_journal_entry
-
quickbooks_get_customer
-
quickbooks_list_accounts
-
quickbooks_query
-
salesforce_create_lead
-
salesforce_create_opportunity
-
salesforce_get_lead
-
salesforce_query
-
salesforce_update_lead_status
-
sap_get_business_partner
-
sap_get_sales_order
-
sap_get_supplier_invoice
-
sap_query_entity_set
-
sap_search_business_partners
-
sap_search_sales_orders
-
sap_search_supplier_invoices
-
scrape_url
-
send_email
-
servicenow_create_incident
-
servicenow_get_incident
-
servicenow_resolve_incident
-
servicenow_search_incidents
-
servicenow_update_incident_state
-
slack_post_message
-
slack_send_approval_card
-
update_lead
-
web_search
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit b1dd115 · analyzer v28 · 3d ago
danger signals1
- committed secret Slack token JoelJohnsonThomas-ForgeFlow-b1dd115/tests/integration/test_slack.py :40
xoxp-u…(15 chars, redacted)
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 258
filesystem 4
- fs JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/evaluation/regression.py :20
from pathlib import Path - fs JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/marketplace/registry.py :20
from pathlib import Path - fs JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/multimodal/images.py :23
from pathlib import Path - fs JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/multimodal/pdf.py :17
from pathlib import Path
network 13
- net JoelJohnsonThomas-ForgeFlow-b1dd115/dashboard/app.py :11
import httpx - net JoelJohnsonThomas-ForgeFlow-b1dd115/dashboard/pages/1_overview.py :5
import httpx - net JoelJohnsonThomas-ForgeFlow-b1dd115/dashboard/pages/2_traces.py :5
import httpx - net JoelJohnsonThomas-ForgeFlow-b1dd115/dashboard/pages/3_cost.py :5
import httpx - net JoelJohnsonThomas-ForgeFlow-b1dd115/dashboard/pages/4_evaluation.py :5
import httpx - net JoelJohnsonThomas-ForgeFlow-b1dd115/dashboard/pages/5_audit.py :16
import httpx - net JoelJohnsonThomas-ForgeFlow-b1dd115/dashboard/pages/6_marketplace.py :7
import httpx - net JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/a2a/transport.py :14
import httpx - net JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/connectors/base.py :28
import httpx - net JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/connectors/sap.py :35
import httpx - net JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/resilience/retry.py :9
import httpx - net JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/security/ssrf_guard.py :30
import socket - net JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/telemetry/emitter.py :96
import httpx
secrets 3
- secrets JoelJohnsonThomas-ForgeFlow-b1dd115/dashboard/app.py :22
_TOKEN = os.environ.get("FORGEFLOW_TOKEN", "") - secrets JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/graph/builder.py :69
os.environ["LANGCHAIN_API_KEY"] = settings.langchain_api_key.get_secret_value() - secrets JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/observability/tracing_provider.py :64
secret_key = os.environ.get("LANGFUSE_SECRET_KEY", "")
database 21
- db JoelJohnsonThomas-ForgeFlow-b1dd115/alembic/env.py :6
from sqlalchemy import engine_from_config, pool - db JoelJohnsonThomas-ForgeFlow-b1dd115/alembic/versions/001_initial_schema.py :8
import sqlalchemy as sa - db JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/api/dependencies.py :5
import asyncpg - db JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/api/routers/approvals.py :9
import asyncpg - db JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/api/routers/audit.py :16
import asyncpg - db JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/api/routers/auth.py :21
import asyncpg - db JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/api/routers/memory.py :16
import asyncpg - db JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/api/routers/metrics.py :5
import asyncpg - db JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/api/routers/workflows.py :11
import asyncpg - db JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/api/routers/workspaces.py :15
import asyncpg - db JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/auth/membership.py :18
import asyncpg - db JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/auth/tokens.py :22
import asyncpg - db JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/auth/users.py :11
import asyncpg - db JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/database.py :7
import asyncpg - db JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/events/redis_consumer.py :103
import redis.asyncio as redis # type: ignore[import-untyped] - db JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/jobs/escalation.py :28
import asyncpg - db JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/memory/memory_manager.py :12
import asyncpg - db JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/memory/pgvector_store.py :15
import asyncpg - db JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/memory/relational_store.py :7
import asyncpg - db JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/observability/metrics_store.py :7
import asyncpg - db JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/observability/prometheus.py :25
import asyncpg
tool registrations 63
- create_lead JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/crm_tools.py :19
- update_lead JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/crm_tools.py :56
- get_lead JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/crm_tools.py :96
- fetch_enrichment JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/data_tools.py :30
- query_db JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/data_tools.py :53
- draft_email JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/email_tools.py :19
- send_email JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/email_tools.py :65
- github_create_issue JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/github_tools.py :24
- github_comment_issue JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/github_tools.py :37
- github_close_issue JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/github_tools.py :45
- github_search_issues JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/github_tools.py :51
- github_review_pr JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/github_tools.py :62
- github_get_repo JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/github_tools.py :74
- hubspot_create_contact JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/hubspot_tools.py :19
- hubspot_upsert_contact JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/hubspot_tools.py :37
- hubspot_search_contacts JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/hubspot_tools.py :52
- hubspot_create_company JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/hubspot_tools.py :58
- hubspot_upsert_company JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/hubspot_tools.py :69
- hubspot_create_deal JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/hubspot_tools.py :80
- hubspot_create_deal_idempotent JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/hubspot_tools.py :104
- hubspot_update_deal_stage JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/hubspot_tools.py :131
- hubspot_add_note JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/hubspot_tools.py :137
- jira_create_issue JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/jira_tools.py :19
- jira_get_issue JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/jira_tools.py :39
- jira_comment_issue JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/jira_tools.py :45
- jira_transition_issue JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/jira_tools.py :51
- jira_search JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/jira_tools.py :57
- msgraph_post_teams_message JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/msgraph_tools.py :20
- msgraph_post_teams_chat JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/msgraph_tools.py :33
- msgraph_post_adaptive_card JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/msgraph_tools.py :43
- msgraph_send_mail JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/msgraph_tools.py :57
- msgraph_list_messages JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/msgraph_tools.py :77
- msgraph_create_event JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/msgraph_tools.py :90
- msgraph_get_user JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/msgraph_tools.py :115
- extract_pdf JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/multimodal_tools.py :14
- describe_image JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/multimodal_tools.py :52
- quickbooks_query JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/quickbooks_tools.py :20
- quickbooks_create_customer JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/quickbooks_tools.py :31
- quickbooks_get_customer JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/quickbooks_tools.py :45
- quickbooks_create_invoice JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/quickbooks_tools.py :51
- quickbooks_list_accounts JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/quickbooks_tools.py :73
- quickbooks_create_journal_entry JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/quickbooks_tools.py :79
- salesforce_create_lead JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/salesforce_tools.py :19
- salesforce_update_lead_status JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/salesforce_tools.py :39
- salesforce_get_lead JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/salesforce_tools.py :45
- salesforce_create_opportunity JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/salesforce_tools.py :51
- salesforce_query JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/salesforce_tools.py :69
- sap_get_sales_order JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/sap_tools.py :19
- sap_search_sales_orders JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/sap_tools.py :25
- sap_get_business_partner JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/sap_tools.py :38
- sap_search_business_partners JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/sap_tools.py :44
- sap_get_supplier_invoice JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/sap_tools.py :52
- sap_search_supplier_invoices JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/sap_tools.py :58
- sap_query_entity_set JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/sap_tools.py :66
- web_search JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/search_tools.py :17
- scrape_url JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/search_tools.py :59
- servicenow_create_incident JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/servicenow_tools.py :19
- servicenow_get_incident JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/servicenow_tools.py :39
- servicenow_update_incident_state JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/servicenow_tools.py :45
- servicenow_resolve_incident JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/servicenow_tools.py :58
- servicenow_search_incidents JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/servicenow_tools.py :68
- slack_post_message JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/slack_tools.py :21
- slack_send_approval_card JoelJohnsonThomas-ForgeFlow-b1dd115/forgeflow/mcp/server/tools/slack_tools.py :40
declared dependencies 25
- fastmcp@>=2.0.0
- langgraph@>=0.2.60
- langgraph-checkpoint-postgres@>=2.0.0
- langchain-core@>=0.3.28
- langchain-openai@>=0.3.0
- langchain-community@>=0.3.0
- langchain-mcp-adapters@>=0.1.0
- fastapi@>=0.115.0
- pytest@>=8.3.0
- pytest-asyncio@>=0.24.0
- pytest-cov@>=6.0.0
- httpx@>=0.28.0
- ruff@>=0.8.0
- mypy@>=1.13.0
- types-beautifulsoup4@*
- testrelic-pytest@>=0.6.4
- langchain-ollama@>=0.2.0
- langchain-anthropic@>=0.3.0
- opentelemetry-api@>=1.27.0
- opentelemetry-sdk@>=1.27.0
- opentelemetry-exporter-otlp-proto-http@>=1.27.0
- opentelemetry-instrumentation-fastapi@>=0.48b0
- pypdf@>=4.3.0
- redis@>=5.0.0
- aiokafka@>=0.11.0
perm:untrusted 4
- untrusted JoelJohnsonThomas-ForgeFlow-b1dd115/dashboard/pages/1_overview.py :18
return httpx.get(f"{API_URL}/metrics/runs?limit=50", timeout=5).json() - untrusted JoelJohnsonThomas-ForgeFlow-b1dd115/dashboard/pages/2_traces.py :18
return httpx.get(f"{API_URL}/metrics/runs?limit=30", timeout=5).json() - untrusted JoelJohnsonThomas-ForgeFlow-b1dd115/dashboard/pages/3_cost.py :22
return httpx.get(f"{API_URL}{path}", params=params or {}, timeout=8).json() - untrusted JoelJohnsonThomas-ForgeFlow-b1dd115/dashboard/pages/4_evaluation.py :18
return httpx.get(f"{API_URL}/metrics/evaluation", timeout=5).json()