Executive-ready slides, one API call away. API-first AI presentation engine with 32 slide types, 24 chart types, 15 themes, finance vertical. PPTX + Google Slides. MCP server for AI agents. TypeScript SDK.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · http counts 6 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
cost_estimate
-
generate
-
pricing
-
render
-
slide_types
-
themes
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit ae71696 · analyzer v33 · 1w ago
skills & prompt files 1
- agent-rules Whatsonyourmind-deckforge-ae71696/CLAUDE.md
danger signals3
- suspicious endpoint 169.254.169.254 (cloud metadata) Whatsonyourmind-deckforge-ae71696/tests/unit/test_url_guard.py :13
"http://169.254.169.254/latest/meta-data/", # cloud metadata (SSRF classic) - suspicious endpoint 93.184.216.34 Whatsonyourmind-deckforge-ae71696/tests/unit/test_url_guard.py :34
assert validate_public_url("https://93.184.216.34/image.png") == "https://93.184.216.34/image.png" - over-broad OAuth scope https://www.googleapis.com/auth/spreadsheets
expected for this server's purpose
Whatsonyourmind-deckforge-ae71696/src/deckforge/rendering/gslides/oauth.py :24
"https://www.googleapis.com/auth/spreadsheets",
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 332
filesystem 14
- fs Whatsonyourmind-deckforge-ae71696/quality/ppteval.py :29
from pathlib import Path - fs Whatsonyourmind-deckforge-ae71696/quality/score_demos.py :18
from pathlib import Path - fs (weak) Whatsonyourmind-deckforge-ae71696/scripts/generate_chart_demos.py :27
from pathlib import Path - fs (weak) Whatsonyourmind-deckforge-ae71696/scripts/generate_demos.py :28
from pathlib import Path - fs (weak) Whatsonyourmind-deckforge-ae71696/scripts/setup_deckforge_db.py :15
from pathlib import Path - fs (weak) Whatsonyourmind-deckforge-ae71696/scripts/test_content_pipeline.py :24
from pathlib import Path - fs (weak) Whatsonyourmind-deckforge-ae71696/scripts/validate-demos.py :30
from pathlib import Path - fs Whatsonyourmind-deckforge-ae71696/src/deckforge/layout/text_measurer.py :7
from pathlib import Path - fs Whatsonyourmind-deckforge-ae71696/src/deckforge/rendering/element_renderers/image.py :85
img = Image.open(image_stream) - fs Whatsonyourmind-deckforge-ae71696/src/deckforge/rendering/thumbnail.py :11
import shutil - fs Whatsonyourmind-deckforge-ae71696/src/deckforge/themes/registry.py :6
from pathlib import Path - fs (weak) Whatsonyourmind-deckforge-ae71696/tests/test_ppteval_harness.py :12
from pathlib import Path - fs (weak) Whatsonyourmind-deckforge-ae71696/tests/unit/test_preview_endpoint.py :12
import shutil - fs (weak) Whatsonyourmind-deckforge-ae71696/tests/unit/test_text_measure.py :12
from pathlib import Path
shell / exec 1
- shell Whatsonyourmind-deckforge-ae71696/src/deckforge/rendering/thumbnail.py :12
import subprocess
network 25
- net Whatsonyourmind-deckforge-ae71696/growth/integrations/autogen-tool.py :23
import httpx - net (weak) Whatsonyourmind-deckforge-ae71696/growth/integrations/claude-agent-example.py :312
import httpx - net Whatsonyourmind-deckforge-ae71696/growth/integrations/crewai-tool.py :22
import httpx - net Whatsonyourmind-deckforge-ae71696/growth/integrations/langchain-tool.py :23
import httpx - net (weak) Whatsonyourmind-deckforge-ae71696/scripts/setup_deckforge_db.py :16
from urllib.parse import urlparse - net (weak) Whatsonyourmind-deckforge-ae71696/scripts/validate-demos.py :87
import urllib.error - net Whatsonyourmind-deckforge-ae71696/src/deckforge/api/middleware/auth.py :17
import httpx - net Whatsonyourmind-deckforge-ae71696/src/deckforge/api/middleware/x402.py :22
import httpx - net Whatsonyourmind-deckforge-ae71696/src/deckforge/api/routes/onboarding.py :15
import httpx - net Whatsonyourmind-deckforge-ae71696/src/deckforge/intelligence/client.py :13
import httpx - net Whatsonyourmind-deckforge-ae71696/src/deckforge/llm/adapters/ollama.py :13
import httpx - net Whatsonyourmind-deckforge-ae71696/src/deckforge/rendering/element_renderers/image.py :47
import httpx - net Whatsonyourmind-deckforge-ae71696/src/deckforge/rendering/gslides/oauth.py :11
from urllib.parse import urlencode - net Whatsonyourmind-deckforge-ae71696/src/deckforge/security/url_guard.py :11
import socket - net Whatsonyourmind-deckforge-ae71696/src/deckforge/workers/settings.py :10
from urllib.parse import urlparse - net Whatsonyourmind-deckforge-ae71696/src/deckforge/workers/webhooks.py :12
import httpx - net (weak) Whatsonyourmind-deckforge-ae71696/tests/conftest.py :14
from httpx import ASGITransport, AsyncClient - net (weak) Whatsonyourmind-deckforge-ae71696/tests/integration/test_auth.py :6
from httpx import AsyncClient - net (weak) Whatsonyourmind-deckforge-ae71696/tests/integration/test_health.py :6
from httpx import AsyncClient - net (weak) Whatsonyourmind-deckforge-ae71696/tests/integration/test_idempotency.py :6
from httpx import AsyncClient - net (weak) Whatsonyourmind-deckforge-ae71696/tests/integration/test_openapi.py :8
from httpx import AsyncClient - net (weak) Whatsonyourmind-deckforge-ae71696/tests/integration/test_rate_limit.py :6
from httpx import AsyncClient - net (weak) Whatsonyourmind-deckforge-ae71696/tests/integration/test_workers.py :16
from httpx import Response - net (weak) Whatsonyourmind-deckforge-ae71696/tests/test_auth_unkey.py :78
with patch("deckforge.api.middleware.auth.httpx.AsyncClient") as mock_client: - net (weak) Whatsonyourmind-deckforge-ae71696/tests/test_discovery.py :6
from httpx import ASGITransport, AsyncClient
secrets 7
- secrets Whatsonyourmind-deckforge-ae71696/growth/integrations/autogen-tool.py :35
key = os.environ.get("DECKFORGE_API_KEY", "") - secrets (weak) Whatsonyourmind-deckforge-ae71696/growth/integrations/claude-agent-example.py :315
api_key = os.environ.get("DECKFORGE_API_KEY", "") - secrets Whatsonyourmind-deckforge-ae71696/growth/integrations/crewai-tool.py :115
key = self.api_key or os.environ.get("DECKFORGE_API_KEY", "") - secrets Whatsonyourmind-deckforge-ae71696/growth/integrations/langchain-tool.py :37
key = api_key or os.environ.get("DECKFORGE_API_KEY", "") - secrets (weak) Whatsonyourmind-deckforge-ae71696/scripts/setup-stripe.py :124
api_key = os.environ.get("STRIPE_SECRET_KEY") or os.environ.get( - secrets (weak) Whatsonyourmind-deckforge-ae71696/scripts/test_content_pipeline.py :332
os.environ.get("ANTHROPIC_API_KEY") - secrets (weak) Whatsonyourmind-deckforge-ae71696/scripts/validate-demos.py :158
default=os.environ.get("DECKFORGE_TEST_API_KEY", ""),
database 37
- db Whatsonyourmind-deckforge-ae71696/alembic/env.py :13
from sqlalchemy import pool - db Whatsonyourmind-deckforge-ae71696/alembic/versions/001_create_users_and_api_keys.py :10
import sqlalchemy as sa - db Whatsonyourmind-deckforge-ae71696/alembic/versions/002_create_decks_and_jobs.py :10
import sqlalchemy as sa - db Whatsonyourmind-deckforge-ae71696/alembic/versions/003_batch_webhook_tables.py :10
import sqlalchemy as sa - db Whatsonyourmind-deckforge-ae71696/alembic/versions/004_billing_tables.py :10
import sqlalchemy as sa - db Whatsonyourmind-deckforge-ae71696/alembic/versions/005_payment_events.py :10
import sqlalchemy as sa - db Whatsonyourmind-deckforge-ae71696/src/deckforge/api/deps.py :12
from redis.asyncio import Redis - db Whatsonyourmind-deckforge-ae71696/src/deckforge/api/middleware/auth.py :20
from sqlalchemy.ext.asyncio import AsyncSession - db Whatsonyourmind-deckforge-ae71696/src/deckforge/api/middleware/rate_limit.py :16
from redis.asyncio import Redis - db Whatsonyourmind-deckforge-ae71696/src/deckforge/api/routes/health.py :10
from sqlalchemy import text - db Whatsonyourmind-deckforge-ae71696/src/deckforge/api/routes/onboarding.py :17
from sqlalchemy import select - db Whatsonyourmind-deckforge-ae71696/src/deckforge/billing/credits.py :16
from sqlalchemy.ext.asyncio import AsyncSession - db Whatsonyourmind-deckforge-ae71696/src/deckforge/billing/stripe_webhooks.py :15
from sqlalchemy.ext.asyncio import AsyncSession - db Whatsonyourmind-deckforge-ae71696/src/deckforge/db/base.py :9
from sqlalchemy import MetaData - db Whatsonyourmind-deckforge-ae71696/src/deckforge/db/engine.py :11
from sqlalchemy.ext.asyncio import ( - db Whatsonyourmind-deckforge-ae71696/src/deckforge/db/models/api_key.py :8
from sqlalchemy import JSON, ForeignKey, String, func - db Whatsonyourmind-deckforge-ae71696/src/deckforge/db/models/batch_job.py :8
from sqlalchemy import ForeignKey, String, func - db Whatsonyourmind-deckforge-ae71696/src/deckforge/db/models/deck.py :8
from sqlalchemy import JSON, ForeignKey, String, func - db Whatsonyourmind-deckforge-ae71696/src/deckforge/db/models/job.py :8
from sqlalchemy import JSON, ForeignKey, String, func - db Whatsonyourmind-deckforge-ae71696/src/deckforge/db/models/payment_event.py :13
from sqlalchemy import DateTime, Numeric, String, func - db Whatsonyourmind-deckforge-ae71696/src/deckforge/db/models/usage.py :12
from sqlalchemy import Date, ForeignKey, String, UniqueConstraint, func - db Whatsonyourmind-deckforge-ae71696/src/deckforge/db/models/user.py :8
from sqlalchemy import String, func - db Whatsonyourmind-deckforge-ae71696/src/deckforge/db/models/webhook_registration.py :8
from sqlalchemy import JSON, Boolean, ForeignKey, String, func - db Whatsonyourmind-deckforge-ae71696/src/deckforge/db/repositories/analytics.py :12
from sqlalchemy import func, select, text - db Whatsonyourmind-deckforge-ae71696/src/deckforge/db/repositories/api_key.py :8
from sqlalchemy import select, update - db Whatsonyourmind-deckforge-ae71696/src/deckforge/db/repositories/batch.py :8
from sqlalchemy import select, update - db Whatsonyourmind-deckforge-ae71696/src/deckforge/db/repositories/deck.py :8
from sqlalchemy import func as sa_func - db Whatsonyourmind-deckforge-ae71696/src/deckforge/db/repositories/job.py :8
from sqlalchemy import select, update - db Whatsonyourmind-deckforge-ae71696/src/deckforge/db/repositories/usage.py :13
from sqlalchemy import select, update - db Whatsonyourmind-deckforge-ae71696/src/deckforge/db/repositories/webhook.py :8
from sqlalchemy import delete, select - db Whatsonyourmind-deckforge-ae71696/src/deckforge/main.py :11
from redis.asyncio import Redis - db Whatsonyourmind-deckforge-ae71696/src/deckforge/workers/settings.py :14
from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine - db (weak) Whatsonyourmind-deckforge-ae71696/tests/conftest.py :15
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine - db (weak) Whatsonyourmind-deckforge-ae71696/tests/integration/test_db.py :16
from sqlalchemy import inspect, text - db (weak) Whatsonyourmind-deckforge-ae71696/tests/integration/test_workers.py :17
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine - db (weak) Whatsonyourmind-deckforge-ae71696/tests/test_analytics.py :15
from sqlalchemy.ext.asyncio import AsyncSession - db (weak) Whatsonyourmind-deckforge-ae71696/tests/test_batch_webhooks.py :138
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
tool registrations 6
- render Whatsonyourmind-deckforge-ae71696/src/deckforge/mcp/server.py :48
- generate Whatsonyourmind-deckforge-ae71696/src/deckforge/mcp/server.py :58
- themes Whatsonyourmind-deckforge-ae71696/src/deckforge/mcp/server.py :68
- slide_types Whatsonyourmind-deckforge-ae71696/src/deckforge/mcp/server.py :74
- cost_estimate Whatsonyourmind-deckforge-ae71696/src/deckforge/mcp/server.py :80
- pricing Whatsonyourmind-deckforge-ae71696/src/deckforge/mcp/server.py :86
declared dependencies 39
- mcp@>=1.26,<2
- fastapi@>=0.135.2
- uvicorn@>=0.42.0
- pydantic@>=2.12.5
- pydantic-settings@>=2.6
- sqlalchemy@>=2.0.48
- alembic@>=1.18.4
- psycopg@>=3.2
- arq@>=0.27.0
- redis@>=5.0
- boto3@>=1.36
- httpx@>=0.28.1
- python-multipart@*
- kiwisolver@>=1.4
- python-pptx@>=1.0.2
- Pillow@>=12.1.1
- pyyaml@>=6.0
- plotly@>=6.6,<7
- kaleido@>=0.2.1,<1.0
- anthropic@>=0.87.0
- openai@>=1.70.0,<2.0
- google-generativeai@>=0.8.0
- sse-starlette@>=3.3.3
- pandas@>=2.2
- openpyxl@>=3.1
- unkey-py@>=0.7
- x402@>=0.1
- pdf2image@>=1.17.0
- google-api-python-client@>=2.150.0
- google-auth@>=2.35.0
- google-auth-oauthlib@>=1.2.1
- pytest@>=8.3
- pytest-asyncio@>=0.24
- pytest-cov@>=6.0
- fakeredis@>=2.25
- aiosqlite@>=0.20
- respx@>=0.22
- ruff@>=0.9
- mypy@>=1.14