费城贫困营利
目录
______________________________________________________________________
一个由人工智能驱动的调查平台,揭示了费城的贫困暴利模式。它将11个公共数据集(约3400万行)组合在一个可查询的系统中,涵盖了财产所有权、代码违规、拆迁、营业执照、税务评估和房地产转让记录,任何人工智能代理或人类通过网络浏览器都可以使用该系统来识别剥削性的有限责任公司和财产所有者。
该系统有三层:a 无服务器数据API (Azure函数+SQL) MCP服务器 它向任何人工智能代理暴露了14种调查工具,以及 网络界面 演示了九个面板——聊天完成代理、Foundry代理(代理服务)、通过MCP的Copilot Studio代理、语义内核多代理、幻灯片、交互式架构图、文档阅读器、关于页面和原始MCP工具测试仪——展示了同一后端如何服务于完全不同的AI集成方法。受Azure身份验证保护(需要Microsoft登录)。Function App与SQL和存储完全通信 IMAP+专用端点 --两者都禁用了公共访问。一切都是无服务器的,每月花费约33美元。
建筑
┌─────────────────────────────────────────────────────────────────────────────┐
│ Interfaces │
│ │
│ Web SPA (chat) Claude Code/Desktop Foundry / Copilot Studio │
│ Browser → /chat stdio (local process) Streamable HTTP (remote) │
└─────┬───────────────────────────┬──────────────────────────┬────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ MCP Server (Container App + local) │
│ │
│ Express server on Azure Container Apps (scale 0-3) │
│ POST /chat — Chat Completions + tool calling (6 models, stateless) │
│ POST /agent — Azure AI Agent Service + MCPTool (persistent threads) │
│ POST /mcp — MCP protocol (Streamable HTTP, 20 tools, session-based) │
│ GET /models — available model list │
│ Also runs locally via stdio for Claude Code/Desktop │
└──────────────────────────────────┬──────────────────────────────────────────┘
│ HTTPS + Ocp-Apim-Subscription-Key
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ Azure API Management (Consumption tier) │
│ Validates subscription key, injects x-functions-key for backend auth │
│ 20 operations (15 GET, 5 POST) │
└──────────────────────────────────┬──────────────────────────────────────────┘
│ HTTPS + x-functions-key
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ Azure Functions v4 (Flex Consumption, Node.js 20) │
│ 20 HTTP-triggered functions, managed identity → Azure AD token auth │
│ VNet-integrated (snet-functions, 10.0.1.0/24) │
└──────────────────────────────────┬──────────────────────────────────────────┘
│ TDS + Azure AD token
│ via Private Endpoint
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ Azure SQL Database (Serverless Gen5, auto-pause) │
│ 11 tables, 6 views, 29+ indexes, ~34M rows │
│ Entity resolution graph + property + license + enforcement + transfer data │
│ Public access DISABLED — private endpoint only │
└─────────────────────────────────────────────────────────────────────────────┘聊天代理的工作原理: 当用户通过网络SPA或 /chat 端点,系统将其与20个工具定义一起发送到Azure OpenAI。LLM自主决定调用哪些工具——它可能会链接3-5个调用来解析名称、提取房产详细信息、检查违规行为和查找转账历史——然后将结果与显示房产位置的内联地图合成为叙述性答案。每个问题循环最多10轮。看 建筑.md 通过示例进行详细演练。
代理人是 检测引擎,而不仅仅是一个查找工具。三个工具(get_top_profiteers, get_llc_network, get_geographic_heat)你从未听说过的表面不良行为者——排名靠前的综合暴利得分、共享包裹的LLC集群和压缩级别的热度得分。系统提示按问题形状路由:未知不良行为者→ 顶级奸商;命名实体→ 实体搜索链;命名地址→ 房产查询;地理的→ 热力图→ 钻进去。
网络界面
在浏览器中尝试: https://kind-forest-06c4d3c0f.1.azurestaticapps.net/
一个带有VS Code风格活动栏的SPA,展示了多种集成模式。受Azure SWA身份验证保护(需要Microsoft登录)。标题中的用户电子邮件和注销按钮。
- 代工模式 --聊天完成+工具模式。用自然语言提问;我们的代码使用GPT-4.1运行代理循环。
- 铸造代理 --使用MCPTool的Azure AI代理服务。Foundry自动从我们的MCP端点发现所有20个工具,并使用GPT-4.1管理工具调用循环。线程在服务器端持续存在——后续问题记住上下文。
- 副驾驶工作室 --Microsoft Copilot Studio代理通过MCP连接。它有自己的面板,上面有一个浮动的聊天小部件。演示使用相同的20个工具的低代码/无代码路径。
- 分类(代理框架) --语义内核多代理(C#/.NET 8)。由路由代理协调的4名专业代理(Triage、OwnerAnalyst、Violation Analyst、AreaAnalyst)。演示Microsoft语义内核代理模式。
- MCP工具测试仪 --原始MCP协议模式。直接连接到MCP服务器,发现工具,并使用特定参数单独调用它们。
- 文档 --内置阅读器,适用于所有项目markdown文件和Jupyter笔记本。无需离开应用程序。
- 幻灯片 --带有动画构建的Reveal.js架构演示。无需离开应用程序即可浏览所有5层。
- 建筑 --交互式D3.js SVG架构图,带有动画连接、悬停高亮显示和点击查看细节面板。
- 关于 --项目概述,包括所有集成模式的卡片。
面板可以并排或单独打开。
快速开始
地方发展(网络SPA)
npm run dev
# → http://localhost:5173代理人 npm --prefix web-app run dev (Vite)。这 predev 钩状连接符号 docs/, images/,以及 jupyter-notebooks/ 进入 web-app/public/.编辑下的任何文件 web-app/src/ --HMR会立即重新加载。使用部署 bash infra/deploy-swa.sh.
克劳德代码
git clone https://github.com/pogorman/mcp-apim.git
cd mcp-apim
npm install
npm run build -w mcp-server复制MCP配置并添加您的订阅密钥:
cp .mcp.json.example .mcp.json
# Edit .mcp.json — replace with your key在Claude Code中打开项目。MCP服务器自动启动并公开所有20个工具。
克劳德桌面
添加到您的配置(~/Library/Application Support/Claude/claude_desktop_config.json 在Mac上, %APPDATA%\Claude\claude_desktop_config.json 在Windows上):
{
"mcpServers": {
"philly-stats": {
"command": "node",
"args": ["
/mcp-server/dist/index.js"],
"env": {
"APIM_BASE_URL": "https://philly-profiteering-apim.azure-api.net/api",
"APIM_SUBSCRIPTION_KEY": ""
}
}
}
}远程MCP客户端(Foundry、Copilot Studio)
MCP服务器部署为具有流式HTTP传输的容器应用程序:
MCP Endpoint: https://philly-mcp-server.victoriouspond-48a6f41b.eastus2.azurecontainerapps.io/mcp
Health Check: https://philly-mcp-server.victoriouspond-48a6f41b.eastus2.azurecontainerapps.io/healthz任何兼容MCP的客户端都可以连接并自动发现所有20个工具。
工具
| 工具 | 说明 |
|---|---|
search_entities | 按名称搜索个人、有限责任公司和公司 |
get_entity_network | 获取链接到实体的所有属性 |
get_property_profile | 包含违规/许可证计数的完整物业详细信息 |
get_property_violations | 代码执行案例(可过滤、分页) |
get_property_assessments | 评估价值历史(2015-2025) |
get_property_licenses | 营业执照和商业执照 |
get_property_appeals | L&I对裁决提出上诉 |
get_property_demolitions | 拆迁记录(城市与业主发起) |
get_property_transfers | 房产的房地产转让/出售历史 |
search_transfers | 按名称、类型、邮政编码、价格搜索500多万笔转账 |
search_businesses | 按关键字/zip查找支票兑现、典当行等 |
get_top_violators | 按代码违规对所有者进行排名 |
get_area_stats | 邮政编码汇总统计 |
run_query | 针对完整数据库自定义只读SQL |
示例提示
连接后,尝试询问您的AI代理:
- “费城违规行为最严重的十大业主是谁?”
- “告诉我GEENA LLC的情况——他们拥有多少房产,有多少违规行为?”
- “邮政编码为19134的地区有哪些支票兑现业务?”
- “显示过去10年405100505号包裹的评估趋势”
- “哪些邮政编码的空置率和违规率最高?”
- “查找拥有50多处房产并有拆迁记录的有限责任公司”
- “深入肯辛顿大道2837号——谁拥有它,有什么违规行为,有没有拆迁?”
- “比较邮政编码19134和19140之间的违规率”
数据
来自11个费城公共数据集的约3400万行:
| 表 | 行 | 它包含什么 |
|---|---|---|
| 实体解析图 | 1930万 | 280万个实体,987万个地址,1550万个链接 |
| OPA Properties | 584K | 费城的每一处房产 |
| 评估 | 640万 | 按年度(2015-2025年)进行税务评估 |
| 营业执照 | 422K | 租赁、食品、商业、空置执照 |
| 商业活动 | 508K | 带有收入代码的商业活动许可证 |
| 代码调查 | 160万 | 违规、检查、通过/失败结果 |
| 上诉 | 316K | L&I分区和建筑规范上诉 |
| 拆迁 | 13.5K | 城市发起和业主发起的拆迁 |
| 房地产转让 | 505万 | 每一份房产契约、抵押贷款和治安官出售 |
项目结构
mcp-apim/
├── mcp-server/ # MCP Server (stdio + Streamable HTTP)
│ ├── src/
│ │ ├── index.ts # Dual transport entry point (Express + stdio)
│ │ ├── tools.ts # 14 MCP tool registrations
│ │ ├── tool-executor.ts # Shared tool definitions + executor (used by chat + agent)
│ │ ├── chat.ts # Chat Completions + tool calling loop
│ │ ├── foundry-agent.ts # Azure AI Agent Service + MCPTool: ensureAgent, createThread, sendMessage
│ │ └── apim-client.ts # HTTP client for APIM
│ └── Dockerfile # Container App deployment (multi-stage, Alpine)
├── functions/ # Azure Functions (14 HTTP endpoints)
│ └── src/functions/ # One file per endpoint
├── sk-agent/ # Semantic Kernel multi-agent (C#/.NET 8)
│ ├── Program.cs # 4-agent orchestrator (Triage, Owner, Violation, Area)
│ ├── Plugins/ # 3 plugin files calling APIM endpoints
│ └── Dockerfile
├── m365-agent/ # M365 Copilot declarative agent (3 JSON + 2 icons)
│ ├── manifest.json # Teams app manifest (v1.25)
│ ├── declarativeAgent.json # Agent definition + conversation starters
│ └── ai-plugin.json # RemoteMCPServer runtime + 15 tool schemas (detection tools not yet exposed)
├── agent/ # Azure AI Foundry agent (Python)
│ └── foundry_agent.py # MCP + Bing grounding
├── web-app/ # Vite + React + TS SPA (city-first routing: /:city/:panel)
│ ├── src/routes/ # One React.lazy route per panel (Dashboard, Chat, FoundryAgent, …)
│ ├── src/chat/ # Shared chat primitives (messages, map, input, thinking, prompts)
│ ├── src/dashboard/ # Chart.js + Leaflet modules
│ └── public/staticwebapp.config.json # AAD auth + SPA navigation fallback
├── docs/ # Project documentation (ELI5, user guide, architecture, FAQ, session log, etc.)
├── sql/schema.sql # Database schema (11 tables, 6 views, 29+ indexes)
├── data/ # Source CSV files (~5.5GB, 11 datasets)
├── jupyter-notebooks/ # Original PhillyStats Fabric/Synapse notebooks
└── infra/ # Bicep IaC (modules/) + deployment scripts (deploy-swa.sh, etc.)成本
所有资源都是无服务器/消耗的——空闲时可扩展到零:
| 资源 | 闲置成本 |
|---|---|
| Azure SQL(无服务器,60分钟后自动暂停) | 0美元 |
| Azure功能(灵活消费) | 0美元 |
| API管理(消费) | $0 |
| 容器应用程序(缩放到零) | $0 |
| Azure OpenAI(按令牌付费) | 0美元 |
| 静态Web应用程序(免费版) | 0美元 |
| 存储(2个帐户) | ~1美元/月 |
| 集装箱登记(基本) | ~0.17美元/月 |
| 私有端点(x4:SQL、blob、表、队列) | ~29/mo |
| 专用DNS区域(x4) | ~2美元/月 |
| 空闲时总计 | 约33美元/月 |
文档
- ELI5.md --用于演示和演示的简明英语讲解员(如果您是新手,请从这里开始)
- 用户指南.md --如何使用web应用程序:所有五个面板、示例提示、提示、连接其他客户端
- 建筑.md -完整的技术参考:架构、ERD、API规范、代理行为、基础设施、容器应用程序深度挖掘
- CLI_CHEATSHET.md --日常管理命令(Foundry代理、容器应用程序、APIM、SQL、MCAPS故障排除)
- 常见问题.md --常见问题:代理架构、MCAPS策略、模型部署、成本、部署陷阱
- COMMANDS.md --用于构建和部署此项目的所有CLI命令
- 会话_LOG.md --按时间顺序记录经验教训的构建日志
- PROMPTS.md --每个构建会话的用户提示
- CLAUDE.md --使用此代码库的AI代理说明
许可证
麻省理工学院
