docs: add architecture doc
This commit is contained in:
@@ -0,0 +1,177 @@
|
||||
# Architecture
|
||||
|
||||
## Directory Structure
|
||||
|
||||
```
|
||||
advanced-mcp-plugin/
|
||||
├── advanced-mcp-plugin.php ← Entry point, autoloader, boot
|
||||
├── docs/ ← This documentation
|
||||
└── includes/
|
||||
├── Core/
|
||||
│ ├── Auth.php ← Bearer token auth, HTTPS, rate limit, scope
|
||||
│ ├── AdminMenu.php ← WP Admin UI (API Keys, Settings, Audit Log tabs)
|
||||
│ ├── TokenManager.php ← HMAC-SHA256 JWT, JTI revocation, secret rotation
|
||||
│ └── Installer.php ← DB table creation on activation
|
||||
├── MCP/
|
||||
│ ├── Server.php ← MCP protocol: initialize / tools/list / tools/call
|
||||
│ └── Registry.php ← Maps tool names → handlers + schemas
|
||||
├── Tools/
|
||||
│ ├── PostTools.php
|
||||
│ ├── PageTools.php
|
||||
│ ├── MediaTools.php
|
||||
│ ├── UserTools.php
|
||||
│ ├── CommentTools.php
|
||||
│ ├── MenuTools.php
|
||||
│ ├── TaxonomyTools.php
|
||||
│ ├── OptionTools.php
|
||||
│ ├── SiteTools.php
|
||||
│ ├── PluginTools.php
|
||||
│ ├── ThemeTools.php
|
||||
│ ├── ThemeDiscoveryTools.php
|
||||
│ ├── SeoTools.php
|
||||
│ ├── WooTools.php
|
||||
│ ├── EmailTools.php
|
||||
│ ├── FileManagerTools.php
|
||||
│ ├── CliTools.php
|
||||
│ ├── RawSqlTools.php
|
||||
│ ├── TransientTools.php
|
||||
│ ├── WidgetTools.php
|
||||
│ ├── ToolHandlers.php ← Master registry: all 123 tools with schemas + scopes
|
||||
│ └── WooTools.php
|
||||
└── Elementor/
|
||||
├── Abilities/
|
||||
│ └── ElementorTools.php ← All 30 Elementor build tools
|
||||
└── Data/
|
||||
└── ElementorData.php ← Read/write Elementor JSON — critical CLI fix
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Request Flow
|
||||
|
||||
```
|
||||
MCP Client (Claude)
|
||||
│
|
||||
▼
|
||||
POST /wp-json/asktam-mcp/v1/mcp
|
||||
│
|
||||
▼
|
||||
Server.php::handle()
|
||||
├── Auth::validate() ← Bearer JWT + scope + rate limit
|
||||
│ ├── extract token from Authorization header
|
||||
│ ├── TokenManager::verify() — HMAC-SHA256, exp, iss, jti
|
||||
│ ├── scope check against requested tool's required scope
|
||||
│ └── rate limit via transient (60 req/min default)
|
||||
│
|
||||
├── method = "initialize" → return server info
|
||||
├── method = "tools/list" → Registry::getTools()
|
||||
└── method = "tools/call"
|
||||
│
|
||||
▼
|
||||
Registry::getHandler($tool_name)
|
||||
│
|
||||
▼
|
||||
Tool class method($args)
|
||||
│
|
||||
▼
|
||||
JSON response
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Authentication Detail
|
||||
|
||||
Every request requires:
|
||||
```
|
||||
Authorization: Bearer <jwt_token>
|
||||
```
|
||||
|
||||
**JWT payload:**
|
||||
```json
|
||||
{
|
||||
"key_id": 3,
|
||||
"iss": "https://mainwp.asktam.net",
|
||||
"exp": 1234567890,
|
||||
"jti": "unique-token-id"
|
||||
}
|
||||
```
|
||||
|
||||
**Signing:** HMAC-SHA256 with 64-char hex secret stored in `wp_options.asktam_mcp_jwt_secret`.
|
||||
|
||||
**Verification (TokenManager.php):**
|
||||
1. Split JWT into header.payload.signature
|
||||
2. Recompute HMAC and compare with `hash_equals()` (timing-safe)
|
||||
3. Check `exp` > `time()`
|
||||
4. Check `iss` matches `get_site_url()`
|
||||
5. Check `jti` not in revocation list
|
||||
6. Load API key from DB by `key_id`, confirm `is_active = 1`
|
||||
|
||||
**API Keys** stored in `mwp_asktam_mcp_keys`:
|
||||
```sql
|
||||
id, name, key_hash (bcrypt), scopes (comma-separated), is_active, created_at, last_used
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Scopes
|
||||
|
||||
| Scope | Access |
|
||||
|---|---|
|
||||
| `read` | GET / list operations |
|
||||
| `write` | Create, update, delete |
|
||||
| `admin` | Plugin management, raw SQL, CLI, options |
|
||||
| `elementor` | All Elementor builder tools |
|
||||
| `woo` | WooCommerce tools |
|
||||
|
||||
Each tool in `ToolHandlers.php` declares a required scope. Auth.php enforces it before dispatch.
|
||||
|
||||
---
|
||||
|
||||
## DB Tables Created on Activation
|
||||
|
||||
```sql
|
||||
-- API keys
|
||||
CREATE TABLE mwp_asktam_mcp_keys (
|
||||
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
key_hash VARCHAR(255) NOT NULL,
|
||||
scopes VARCHAR(500) DEFAULT 'read',
|
||||
is_active TINYINT(1) DEFAULT 1,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
last_used DATETIME DEFAULT NULL
|
||||
);
|
||||
|
||||
-- Audit log
|
||||
CREATE TABLE mwp_asktam_mcp_log (
|
||||
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
key_id BIGINT UNSIGNED DEFAULT NULL,
|
||||
tool_name VARCHAR(100) NOT NULL,
|
||||
ip_address VARCHAR(45) DEFAULT NULL,
|
||||
status VARCHAR(20) DEFAULT 'success',
|
||||
duration FLOAT DEFAULT NULL,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## WP Admin Panel
|
||||
|
||||
**Location:** WP Admin → AskTam MCP (top-level menu)
|
||||
|
||||
| Tab | Purpose |
|
||||
|---|---|
|
||||
| API Keys | Generate JWT tokens, set scopes, revoke keys |
|
||||
| Settings | HTTPS enforcement, rate limit, request logging, raw SQL toggle |
|
||||
| Audit Log | Last 1000 tool calls: key_id, tool, IP, timestamp |
|
||||
|
||||
---
|
||||
|
||||
## Namespace
|
||||
|
||||
`AskTamMCP\` — PSR-4 autoloader registered in `advanced-mcp-plugin.php`.
|
||||
|
||||
All classes map to `includes/` directory:
|
||||
- `AskTamMCP\Core\Auth` → `includes/Core/Auth.php`
|
||||
- `AskTamMCP\Tools\PostTools` → `includes/Tools/PostTools.php`
|
||||
- `AskTamMCP\Elementor\Abilities\ElementorTools` → `includes/Elementor/Abilities/ElementorTools.php`
|
||||
Reference in New Issue
Block a user