Secret MCP
This server is an MCP-based design-research and web-search assistant that finds GDWEB design references, generates per-reference implementation specifications through isolated LLM sampling, and can search/extract general web content.
Generate design specifications: Call
generate-gdweb-design-indexesto search GDWEB and create one detailedDESIGN_INDEXmarkdown document per reference, with page layouts, coordinates, colors, typography, responsive rules, and implementation tasks.Maintain strict per-reference isolation: Each design reference gets its own separate
sampling/createMessagerequest withincludeContext: none, and results are saved independently before moving to the next reference.Search GDWEB references: Use
search-gdweb-designsto get lightweight lists of award-winning and recent web designs with metadata, filtered by year, awards, and exclusions.Full web research: Use
full-web-searchto search the web and extract complete page content from top results.Lightweight web search: Use
get-web-search-summariesto get titles, URLs, and snippets without fetching full pages.Extract specific pages: Use
get-single-web-page-contentto pull full content from a known URL.Manage design exclusions: Works excluded via the web viewer are filtered out from future GDWEB searches and generation runs.
Inspect runs locally: The optional web viewer shows per-work evidence images, measured colors/coordinates, request contracts, generation logs, and final documents.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Secret MCPSearch GDWEB for modern landing page designs and create a DESIGN_INDEX for each result."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
English | 한국어
Target Architecture

Secret MCP
An evidence-grounded MCP server for web design analysis, screenshot-to-specification workflows, and frontend reconstruction planning.
npx -y secret-design-mcpSecret MCP is a local Model Context Protocol (MCP) server that searches GDWEB for recent design references and creates a separate LLM request and a separate DESIGN_INDEX file for every search result. Each file contains page- and route-specific layouts, navigation, pixel coordinates, colors, components, and responsive specifications traceable to the supplied visual evidence.
The name Secret MCP does not mean that the project provides secret features or private data. It was the project name used while experimenting in a private repository with the idea of building an MCP server around design websites. The project's current purpose is to extract reproducible structural evidence from public design references and turn it into one specification per work that an LLM can apply to a new project.
Images and descriptions from multiple works are never combined in a single LLM context or document. The server processes search results sequentially inside the server, creates an independent MCP sampling/createMessage request for each work, saves that work's file, and only then advances to the next work. A separate local web application lets you select one work at a time, inspect its source evidence, measured colors and coordinates, LLM contract, generation log, and final document, and manage the exclusion list for subsequent searches.
Related MCP server: Refero MCP
Research Note
Evidence-Isolated Multimodal Design Analysis through MCP Sampling
Working paper and implementation report · Secret MCP v0.6.0 · not peer reviewed
Abstract
Secret MCP implements an auditable pipeline for converting public webpage screenshots into implementation-oriented design specifications. The system prepares desktop and mobile visual evidence, records crop coordinates and representative pixel colors, and invokes client-side MCP sampling once per reference. Unlike workflows that concatenate several design references into one prompt, Secret MCP treats reference identity as both a request boundary and an artifact boundary: one reference produces one sampling request, one request contract, and one DESIGN_INDEX document. Each request asks for includeContext: none and applies the same 19-section specification contract covering routes, geometry, components, design tokens, responsive behavior, accessibility, implementation tasks, acceptance criteria, and uncertainty. This report evaluates protocol-level isolation and artifact production; it does not claim that one language model, prompt, or reconstruction method outperforms another. A live smoke test verifies the request boundary, while a preserved three-reference run provides descriptive measurements and a qualitative implementation case.
Research Questions
Question | Current evidence | Status |
RQ1. Can an MCP design-analysis tool maintain one-reference-per-request isolation? | Live sampling smoke test with cross-reference ID inspection and output-file checks | Verified within the test scope |
RQ2. Can screenshot evidence be transformed into auditable spatial, color, and document artifacts? | Preserved three-reference run with evidence manifests, contracts, and generated documents | Descriptively verified |
RQ3. Can the resulting specification guide a distinct frontend implementation? | AEROFLOW qualitative case study | Preliminary; no controlled comparison |
Formal System Model
For reference r_i, the prepared evidence set contains image tiles I, crop bounds B, representative-color measurements P, and source metadata M. The fixed specification contract is C; the independent request and resulting document are q_i and D_i.
E_i = { I_i,k, B_i,k, P_i,k, M_i }
q_i = sampling/createMessage(C, E_i; includeContext = none)
D_i = G_theta(q_i)
References(q_i) = { r_i }
For every i != j: referenceId(r_j) is absent from q_iCoordinates measured inside a prepared tile map back to the original screenshot as follows.
x_source = (cropLeft + x_tile) / scaleX
y_source = (cropTop + y_tile) / scaleYThis is an operational isolation invariant, not a claim of statistical independence. The server and smoke test can inspect request contents and artifacts; they cannot prove what an arbitrary external model provider may retain outside the MCP message.
Empirical Results
Protocol Isolation
flowchart LR
R1["gdweb-26522"] --> Q1["Request 1<br/>5 evidence images<br/>includeContext: none"] --> D1["DESIGN_INDEX_gdweb-26522.md"]
R2["gdweb-24516"] --> Q2["Request 2<br/>4 evidence images<br/>includeContext: none"] --> D2["DESIGN_INDEX_gdweb-24516.md"]Sampling request |
|
| Output documents |
Request 1 | 1 | 0 | 1 |
Request 2 | 0 | 1 | 1 |
Figure 1. Live smoke test recorded on 2026-08-22 using the query 금융 (n = 2 sampled references after excluding gdweb-26905). Each request contained its own reference ID and visual evidence, no other sampled reference ID, and includeContext: none; the run produced two distinct Markdown files. The test verifies observable request composition and file separation, not model-memory behavior outside the protocol.
Recorded Run Measurements
xychart-beta
title "Prepared evidence images per reference"
x-axis ["gdweb-27294", "gdweb-25378", "gdweb-24234"]
y-axis "Evidence images" 0 --> 5
bar [3, 4, 5]Reference | Desktop source height | Prepared images | Image payload | Color measurements | Document tokens | Document size | Required headings |
| 2,675px | 3 | 126.6KB | 24 | 7,921 | 54.0KB | 19/19 |
| 7,043px | 4 | 302.5KB | 32 | 9,953 | 69.8KB | 19/19 |
| 7,832px | 5 | 387.8KB | 40 | 9,517 | 63.2KB | 19/19 |
Figure 2. Descriptive measurements from preserved run 2026-07-29T15-54-10-483Z-5c70317e (n = 3 references). The run prepared 12 evidence images totaling 816.9 decimal KB and recorded 96 representative-color measurements. It produced three DESIGN_INDEX documents totaling 27,391 whitespace-delimited tokens and 187.0 decimal KB. All three contain headings 1–19; heading presence does not establish semantic correctness.
Qualitative Case Study
(a) Evidence and measurements | (b) Per-reference | (c) Specification-driven implementation |
|
|
|
Figure 3. A preserved qualitative trace from the GDWEB evidence viewer to the generated Korean Air DESIGN_INDEX and then to AEROFLOW. AEROFLOW intentionally introduces new branding, content, imagery, and functionality; this example illustrates specification use and is not a controlled visual-fidelity comparison.
Interpretation and Limitations
The live isolation result has
n = 2; the recorded artifact analysis hasn = 3. Neither supports broad claims about design quality or model performance.The current evaluation has no control group, human rating, repeated trials, confidence intervals, or comparison against screenshot-to-code baselines.
Representative colors are measured after resizing, JPEG normalization, and channel quantization. They are screenshot evidence, not proof of the source website's CSS tokens.
The 19/19 result measures required heading presence. A future benchmark must separately evaluate factual grounding, coordinate error, color difference, responsive behavior, and implementation fidelity.
The qualitative implementation is an existence example, not evidence that Secret MCP improves reconstruction quality.
Usage
1. Install and Build
Node.js 20.19 or later is required.
The published MCP server can be launched with:
npx -y secret-design-mcpClone the repository when you also need the local viewer or want to work on the source:
git clone https://github.com/yyeongjin/secret_mcp.git
cd secret_mcp
npm install
npm run build2. Start the Web Application
Set DESIGN_INDEX_OUTPUT_DIR to the same value for the MCP server and the web application so that both processes read the same output directory.
DESIGN_INDEX_OUTPUT_DIR=/absolute/path/to/design-index npm run webOpen the following address in a browser.
http://127.0.0.1:4317The web application displays the generation-run list, per-work progress, GDWEB evidence images, measured coordinates and palettes, the specification contract sent to the LLM, the final Markdown, and generation timestamps. Documents and evidence are read-only; only Exclude from search and Remove exclusion change the filter used by subsequent searches.
3. Register the MCP Server
{
"mcpServers": {
"secret-mcp": {
"command": "npx",
"args": [
"-y",
"secret-design-mcp"
],
"env": {
"DESIGN_INDEX_OUTPUT_DIR": "/absolute/path/to/design-index",
"SECRET_MCP_WEB_ORIGIN": "http://127.0.0.1:4317"
}
}
}
}For a source checkout, replace command and args with "command": "node" and "args": ["/absolute/path/to/secret_mcp/dist/index.js"].
The MCP client must support sampling/createMessage. When a client does not support sampling, the server returns an explicit error instead of running a fallback that places multiple works in the same context.
The MCP stdio server itself does not open an HTTP port. The client launches node dist/index.js as a child process and exchanges JSON-RPC messages over stdio. Only the separate web viewer process uses port 4317 by default.
Direct Sampling Client for Hosts Without Sampling
The server does not need to be modified when the outer MCP host cannot answer sampling/createMessage. A separate MCP protocol client can connect directly to dist/index.js, advertise sampling: {}, and handle every sampling request by launching a fresh Codex LLM process in a fresh temporary workspace.
const client = new Client(
{ name: 'secret-mcp-sampling-client', version: '1.0.0' },
{ capabilities: { sampling: {} } }
);
client.setRequestHandler(CreateMessageRequestSchema, async request => {
const workspace = await mkdtemp('secret-mcp-sampling-');
const response = await launchFreshCodex({
workspace,
messages: request.params.messages,
systemPrompt: request.params.systemPrompt,
});
return {
model: response.model,
role: 'assistant',
content: { type: 'text', text: response.markdown },
};
});The sampling handler must copy only the current request's text blocks and evidence images into that workspace. It must not reuse a Codex conversation, process, working directory, response file, or message history from another work. The workspace launches one new Codex process, waits for its complete Markdown response, returns that response to the pending MCP sampling call, and can then be removed after the server has saved the work's contract, evidence, and document.
The server still controls the sequential queue: work 2 is not prepared until work 1 has returned and been saved. This makes the fresh process and workspace an execution-level equivalent of the protocol-level includeContext: none boundary without adding a combined fallback to the server. The direct client becomes the sampling-capable MCP host; it should use a tool-call timeout long enough for the per-work output budget and must never answer multiple sampling requests through one persistent LLM conversation.
4. Ask the LLM
A separate /web-design slash command is not required.
Find three recent design references on GDWEB that are suitable for a Godot project website.
Analyze every search result through a completely independent LLM request,
and create one reproducible DESIGN_INDEX document for each result.
Inside each document, separate every visible page into its own page specification,
and specify everything from navigation and section coordinates to exact color formats and responsive values.The host LLM calls the generate-gdweb-design-indexes tool once. The MCP server performs the search and separates the per-work LLM requests internally.
The manual tool-call format is shown below.
{
"name": "generate-gdweb-design-indexes",
"arguments": {
"query": "game portfolio",
"limit": 3,
"awardOnly": true,
"includePreviousYear": true,
"language": "English",
"outputDirectory": "/absolute/path/to/design-index",
"maxTokens": 131072
}
}If outputDirectory is omitted, the tool uses the DESIGN_INDEX_OUTPUT_DIR environment variable. If that variable is also absent, it uses the design-index directory under the server's working directory.
maxTokens is a per-work output budget, not a budget shared by the run and not a budget divided equally between pages. A single work may contain multiple visible pages or routes, and every page must repeat the complete page-specific parts of the 19-section contract. The default and minimum are therefore 131072 tokens. Clients may request up to 262144 tokens for exceptionally large multi-page evidence sets.
With limit: 3, the default run can request up to three independent 131072-token outputs; the works do not share one 131072-token pool. The connected sampling client and selected model must support the requested output size. If the model returns stopReason: maxTokens, the server treats that work as failed instead of saving a truncated DESIGN_INDEX as complete.
When the tool completes, it returns the run ID, run-manifest path, per-work document paths, and web-viewer URL.
End-to-End Example: From GDWEB Specifications to a Godot Aviation Website
For the actual example, Secret MCP found three aviation award winners registered on GDWEB in 2026 and 2025, created a DESIGN_INDEX for each work through an independent LLM request, and then applied the structure of the Korean Air reference to a Godot aviation project website.
The finished AEROFLOW website is not a clone of the Korean Air website. It uses the information hierarchy, navigation, action panel, section arrangement, and responsive principles from the specification while introducing a new brand, copy, aviation imagery, and content. This example demonstrates that even when the resulting design differs from the reference, measurable structural evidence can still produce a polished website with a distinctive identity.
Run the Example
# 1. Build
npm install
npm run build
# 2. Per-work document web viewer
DESIGN_INDEX_OUTPUT_DIR="$PWD/tmp/design-index/aviation-godot-20260730" npm run web
# 3. Specification-driven result website
python3 -m http.server 4320 \
--bind 127.0.0.1 \
--directory tmp/showcase/aviation-godot/generated-siteAfter starting the processes, open the following screens.
Per-work specification web viewer: http://127.0.0.1:4317/?run=2026-07-29T15-54-10-483Z-5c70317e
AEROFLOW result website: http://127.0.0.1:4320
1. Per-Work Specification Results
Select works one at a time from the run list on the left. The right side displays only the final DESIGN_INDEX for the selected work, without mixing in content from other works.

2. Evidence Images and Measurements
The Evidence tab shows the desktop and mobile images sent to the independent LLM request, tile coordinates, reduction ratios, and representative colors.

3. Independent LLM Request Contract
The Request Contract records page separation, navigation, section bounds, HEX/RGB/HSL colors, components, the responsive matrix, and acceptance criteria. This contract prevents the result from ending as a superficial mood summary and makes it an implementation specification another LLM can use.

4. Generation Process
The Generation Log shows the sequence from search and evidence preparation through the independent per-work LLM request, document save, and full-run completion. This run processed all three works with separate includeContext: none requests.

5. Specification-Driven AEROFLOW First View
The bright aviation portal and action-panel structure observed in the Korean Air reference were adapted to a Godot project. The brand, aircraft imagery, copy, and functionality were created specifically for this result.

6. Project Highlights
The reservation and promotion card structure was repurposed for core project content: flight regions, a glass cockpit, and real-time weather.

7. Development Log and Shortcuts
The source reference's notices and service shortcuts were restructured into build history, development progress, flight models, avionics, media, controls, and roadmap navigation.

8. Media and Footer
The final area contains project media, development, support, and license links, followed by an independent-project footer.

What This Result Demonstrates
A new project can use a validated information hierarchy and layout relationships without copying the reference's logo, trademarks, copy, or images.
Converting static screenshots into navigation, pixel bounds, color tokens, components, and a responsive matrix gives another LLM enough detail to create a concrete implementation plan.
Even with the same structural evidence, newly designed content, branding, and visual assets can create a distinctive identity that differs from the source.
Secret MCP is intended to extract structural evidence from good design and use it to build a polished website suited to a new project, not to reproduce the source pixel for pixel.
Specification and Request Contract
These links point directly to the actual files included in the repository. The same artifacts are also grouped under tmp/showcase/aviation-godot through relative symbolic links for local execution and browsing.
Core Execution Architecture
flowchart TD
User["User request"] --> Host["Host LLM"]
Host --> Tool["One generate-gdweb-design-indexes call"]
Tool --> Exclusions["Load the exclusion list managed in the web viewer"]
Exclusions --> Search["Search GDWEB internally and filter work IDs"]
Search --> Queue["Keep results inside the server"]
Queue --> R1["Work 1 images + specification contract"]
R1 --> S1["Independent sampling/createMessage request 1"]
S1 --> F1["Save DESIGN_INDEX_gdweb-1.md"]
F1 --> R2["Work 2 images + specification contract"]
R2 --> S2["Independent sampling/createMessage request 2"]
S2 --> F2["Save DESIGN_INDEX_gdweb-2.md"]
F2 --> More["Repeat sequentially for every work"]
More --> Manifest["Record per-work evidence and status in run.json"]
Manifest --> Web["Inspect one work at a time in the local web viewer"]
Manifest --> Status["Return only file paths and statuses to the host"]The following boundaries are essential.
Images or specification bodies from multiple works are never returned to the outer host LLM as one batch.
With
limit: 3, the server performs exactly up to three mutually independent LLM sampling requests.Every sampling request uses
includeContext: none.A sampling request contains only one work's metadata and image tiles.
The previous work's ID, images, and analysis document are never passed into the next work's request.
Works excluded in the web viewer are removed from search results before any sampling request is created.
The server starts the next work only after saving the current sampling response to a file.
At the end, only generated file paths, the model used, and success or failure status are returned to the host.
In other words, this is not the earlier architecture in which the host LLM reads every result at once and produces a combined summary.
Web Viewer
The web viewer reads DESIGN_INDEX_OUTPUT_DIR/.secret-mcp-runs every 2.5 seconds. There is no separate database or debugging connection between the MCP generation process and the web server.
The interface contains the following areas.
Generation runs: query, requested count, allowed years, and overall status
Work list: progress and evidence-image count for each
gdweb-<work-number>Work details: specification, evidence images and measurements, request contract, and generation log for one selected work
Search exclusions: exclude the selected work from future searches, include it again, and manage the full exclusion list
When a run contains three works, it also produces three documents as shown below.
.secret-mcp-runs/<run-id>/
├── run.json
├── contracts/
│ ├── gdweb-26905.md
│ ├── gdweb-26522.md
│ └── gdweb-xxxxx.md
├── evidence/
│ ├── gdweb-26905_desktop_01-of-05.jpg
│ ├── gdweb-26522_desktop_01-of-04.jpg
│ └── ...
└── documents/
├── DESIGN_INDEX_gdweb-26905.md
├── DESIGN_INDEX_gdweb-26522.md
└── DESIGN_INDEX_gdweb-xxxxx.mdrun.json is not a file that combines document bodies from multiple works. It is a viewer manifest containing only per-work file paths, status, timestamps, model, and evidence lists.
Search Exclusion List
Selecting Exclude from search in the web viewer saves the work number to the following file.
DESIGN_INDEX_OUTPUT_DIR/.secret-mcp/exclusions.jsonHistorical runs and generated documents are never deleted.
New
generate-gdweb-design-indexesandsearch-gdweb-designsruns filter work numbers before selection.To avoid returning too few results because of exclusions, the search reads additional GDWEB candidates and selects the requested
limitfrom the non-excluded works.Selecting
Remove exclusionmakes the work eligible again starting with the next search.The MCP server and web viewer must use the same
DESIGN_INDEX_OUTPUT_DIRto share the same exclusion list.
Image Processing
GDWEB's full desktop captures can be extremely tall and several megabytes in size. Sending the original base64 data directly in a sampling request can exceed MCP transport limits or cause a vision model to miss fine structural details.
Before creating the request for each work, gdweb-sampling-images.ts performs the following operations.
Load the GDWEB desktop registration image with
sgbn=1Load the GDWEB mobile registration image with
sgbn=3Resize the desktop image to a maximum width of 1200px
Split a long page into overlapping vertical tiles 1600px high
Preserve the mobile image as separate evidence
Compress the evidence as JPEG to reduce the MCP sampling-request size
Record the original and prepared canvas dimensions, scale factor, prepared
x/y/width/heightcoordinates, source-space coordinates, and source URL for every tileMeasure eight representative colors from every tile and record HEX, RGB, HSL, and pixel coverage
Multiple tiles from one work are included in the same work-specific sampling request. Tiles from different works are never included in the same request.
Representative colors are measurements sampled from normalized screenshot pixels. They are precise evidence for visual comparison, but they must not be presented as the source site's CSS variables because JPEG error and image content affect the values. The generation contract distinguishes MEASURED colors from INFERRED implementation tokens.
The server does not open the work's live production website or crawl its DOM. Visual evidence is limited to the images and metadata registered on GDWEB.
GDWEB Search
Design search does not use browser automation, Bing, Brave, or DuckDuckGo.
Query
-> POST https://www.gdweb.co.kr/sub/search.asp
-> form field: Txt_word=<query>
-> parse the GDWEB result HTML
-> collect work number, category, and registration year
-> retain only the current and previous year
-> load GDWEB detail metadata and registered imagesFreshness Policy
If
yearis omitted, the current runtime year is used.includePreviousYeardefaults totrue.When run in 2026, only works registered in 2026 and 2025 are allowed by default.
With
includePreviousYear: false, only the target year is allowed.awardOnlydefaults totrue, so works without an award name are excluded.limitcan be set from 1 through 10.
Work Metadata
Field | Description |
| GDWEB work number, also used in the document filename |
| GDWEB work-category value |
| Work title |
| GDWEB work detail page |
| Registration date and the year used for filtering |
| Award name |
| Design concept |
| Primary color |
| Production company |
| GDWEB desktop capture ( |
| GDWEB mobile capture ( |
DESIGN_INDEX Specification
Every independent sampling request includes the secret-mcp/design-index/v2 contract. The resulting filename is DESIGN_INDEX_gdweb-<strNo>.md.
There is one file per work, but each file begins with a page and route inventory and repeats a complete subsection for every verified page. The contract does not mistake sections in a long scrolling capture for separate pages; it splits pages only when the evidence collage visibly contains separate screens.
Every document must contain all 19 numbered sections below.
Area | Required Specification |
Reconstruction goal | Reference ID, target fidelity, routes, target viewports, and non-goals |
Evidence and coordinate system | Image IDs, original/prepared dimensions, scale, tile coordinates, source-space coordinates, and overlap-removal method |
Site map | Verified pages and routes, purpose, evidence images, shared shell, active menu, and confidence |
Shared app shell | Global background, container, gutters, overlays, page chrome, and stacking context |
Navigation | Desktop and mobile heights, logo/menu coordinates, gaps, touch areas, and active/hover/focus/open states |
Per-page specification and coordinate table | Canvas model, section order, x/y/width/height, layout, states, data, and evidence level for every page |
Layout deep dive | DOM, grid/flex, tracks, min/max, ratios, gaps, overflow, sticky, absolute, and z-index |
Component abstraction | Page-linked component tree, props, variants, slots, state, events, and data contracts |
Tokens and exact colors | HEX/RGB/HSL/alpha, usage, measurement coordinates, confidence, tolerance, and CSS variables |
Typography | Font family by role, px/rem, weight, line height, letter spacing, alignment, truncation, and responsive values |
Assets and icons | Page and section, display size, aspect ratio, crop, focal point, object-fit, loading, and fallback strategy |
Responsive matrix | Containers, columns, order, visibility, navigation, and spacing at 1440/1280/1024/768/390/360px |
Interaction and motion | Color, opacity, transform, duration, easing, keyboard, and reduced-motion behavior for every state |
Accessibility | Per-page landmarks, headings, focus, menu semantics, labels, alt text, contrast, and touch targets |
Data and content | Page entities, fields, counts, ordering, formats, localization, and loading/empty/error fixtures |
Frontend architecture | Routes, directories, page/shared modules, tokens, assets, state, and server/client boundaries |
Implementation task graph | Measurement, shell, navigation, per-page task IDs, dependencies, deliverables, and completion criteria |
Per-page acceptance criteria | Coordinate, color, and typography tolerances; viewport comparison; overflow; assets; keyboard; and performance |
Uncertainties and decisions | Per-page and per-section UNKNOWNs, adopted values, alternatives, confidence, and additional evidence required |
Every major judgment is marked with one of the following evidence levels.
OBSERVED: directly visible in a GDWEB image or metadataMEASURED: numerically verified from supplied pixel coordinates or the measured paletteINFERRED: reasonably inferred to reproduce the same resultUNKNOWN: cannot be verified from static evidence and must not be asserted as fact
Another LLM must be able to derive the component tree, tokens, responsive rules, assets, implementation order, and validation items from the completed document alone.
Exposed Tools
The server currently exposes five MCP tools.
Tool | Purpose |
| Search GDWEB, make an isolated LLM request per result, and save documents |
| Return a GDWEB reference list without generating specifications |
| Search the general web and extract full page content |
| Return titles, URLs, and descriptions from a general search |
| Extract the full content of a known general webpage |
Use generate-gdweb-design-indexes for design planning, layout analysis, implementation specifications, and DESIGN_INDEX requests. Use search-gdweb-designs only for lightweight list requests.
Source Structure
secret_mcp/
├── src/
│ ├── index.ts MCP tool registration and sampling requests
│ ├── dashboard-server.ts Local web server and document/exclusion APIs
│ ├── design-index-run-store.ts Run manifest and per-work artifact records
│ ├── design-exclusion-store.ts Add/remove persistent search exclusions
│ ├── design-index-paths.ts Shared MCP/viewer output-path resolution
│ ├── gdweb-design-search.ts GDWEB search, year filtering, and registered-image loading
│ ├── gdweb-design-index-generator.ts Sequential per-work generation and Markdown saving
│ ├── gdweb-sampling-images.ts Long-capture resizing, tiling, and compression
│ ├── design-spec-contract.ts Required DESIGN_INDEX specification contract
│ ├── search-engine.ts General Bing, Brave, and DuckDuckGo search
│ ├── enhanced-content-extractor.ts General webpage content extraction
│ ├── browser-pool.ts Browser pool for general content extraction
│ ├── rate-limiter.ts General-search request limits
│ ├── types.ts Search and tool types
│ └── utils.ts URL, text, and timestamp utilities
├── web/
│ ├── index.html Web viewer interface
│ ├── styles.css Desktop and mobile layout
│ └── app.js Run refresh and per-work document switching
├── .github/workflows/
│ ├── ci.yml Build, lint, and package validation
│ ├── gdweb-smoke.yml Live GDWEB search and image validation
│ └── release.yml Release-package generation
├── tmp/DESIGN_CONTEST_SITES.md Design competition and award website list
├── tmp/reconstructions/
│ └── gdweb-27294-godot/ Specification-driven AEROFLOW static website
├── tmp/showcase/aviation-godot/
│ ├── DESIGN_INDEX.md Relative symbolic link to the per-work specification
│ ├── REQUEST_CONTRACT.md Relative symbolic link to the independent request contract
│ ├── RUN_MANIFEST.json Relative symbolic link to the run manifest
│ ├── generated-site/ Relative symbolic link to the result website
│ └── screenshots/ Run and result screens used by this README
├── mcp.json MCP registration example
└── package.jsonDevelopment and Validation
npm run build
npm run lint
npm run smoke:gdweb-isolation
npm run webThe isolation smoke test connects a mock MCP client that supports sampling and verifies the following behavior.
The number of search results equals the number of sampling requests.
Each sampling request contains exactly one reference ID.
No other work's ID is mixed into a request.
Every request uses
includeContext: none.Every request includes GDWEB images.
Every result creates a separate Markdown file.
An excluded work does not enter subsequent search results or sampling requests.
The specification contract contains per-page, navigation, coordinate, and color requirements.
The run-manifest evidence records tile coordinates and measured palettes.
Runtime Environment Variables
Name | Default | Description |
|
| Directory where generated documents are stored |
|
| Web-viewer address included in MCP results |
|
| Web-server bind address |
|
| Web-server port |
|
| Timeout for each independent per-work LLM request in milliseconds |
|
| Maximum page-body length extracted from a general webpage |
|
| Timeout for general HTTP and browser requests |
|
| Maximum number of browsers used for general extraction |
|
| Browsers used for general search and extraction |
|
| Whether Playwright runs headlessly |
|
| Whether to compare every engine during general search |
|
| Whether to print browser lifecycle logs |
Documentation
Related Work and References
Secret MCP is positioned as an implementation artifact adjacent to multimodal UI understanding and screenshot-to-code research. It has not yet been evaluated on the datasets or metrics used by the papers below, so their results must not be interpreted as Secret MCP results.
Chenglei Si, Yanzhe Zhang, Ryan Li, Zhengyuan Yang, Ruibo Liu, and Diyi Yang. Design2Code: Benchmarking Multimodal Code Generation for Automated Front-End Engineering. NAACL 2025. Introduces real-world screenshot-to-code evaluation with visual and element-level metrics. Paper
Bryan Wang, Gang Li, Xin Zhou, Zhourong Chen, Tovi Grossman, and Yang Li. Screen2Words: Automatic Mobile UI Summarization with Multimodal Learning. UIST 2021. Studies representations that combine screenshot, text, structure, and UI semantics. Paper
Jing Yu Koh, Robert Lo, Lawrence Jang, Vikram Duvvur, Ming Chong Lim, Po-Yu Huang, Graham Neubig, Shuyan Zhou, Ruslan Salakhutdinov, and Daniel Fried. VisualWebArena: Evaluating Multimodal Agents on Realistic Visually Grounded Web Tasks. ACL 2024. Establishes the importance and difficulty of visually grounded web-agent evaluation. Paper
Model Context Protocol. Sampling specification. Defines client-mediated
sampling/createMessage, including request messages, model preferences, token budgets, and context controls. Specification
Citation
Secret MCP is currently software with a working research note, not a peer-reviewed publication.
@software{jo2026secretmcp,
author = {{조영진}},
title = {Secret MCP: Evidence-Isolated Multimodal Design Analysis through MCP Sampling},
year = {2026},
version = {0.6.0},
url = {https://github.com/yyeongjin/secret_mcp},
note = {Software artifact and working implementation report}
}Research Paper
Secret MCP: Evidence-Bounded and Context-Isolated Design Specification Generation from Web Screenshots — arXiv:2608.24944
Available Tools
5 toolsfull-web-searchA
Search the web and fetch complete page content from top results. This is the most comprehensive web search tool. It searches the web and then follows the resulting links to extract their full page content, providing the most detailed and complete information available. Use get-web-search-summaries for a lightweight alternative.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results to return with full content (1-10) | |
| query | Yes | Search query to execute (recommended for comprehensive research) | |
| includeContent | No | Whether to fetch full page content (default: true) | |
| maxContentLength | No | Maximum characters per result content (0 = no limit). Usually not needed - content length is automatically optimized. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It does disclose a genuine behavioral trait: the tool performs a two-stage operation (search, then follow links to extract full page content), which tells the agent this is heavier than a plain search. However, it stops short of warning about the costs or failure modes of that behavior — latency, a slow underlying website, partial fetch successes, or content truncation — which an agent would benefit from knowing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each of which earns its place: the first defines the action, the second states the positioning and mechanism, and the third gives the explicit alternative routing. The content is dense yet minimal, with the most important facts appearing in the first sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderately simple 4-parameter tool with rich schema coverage, the description provides the essential facts and points to the correct alternative. The main missing piece is absence of an expected latency/failure profile for the full-page extraction step — coverage that would be especially useful given the 'fetches full content' behavior and the format of results is not specified. Still, what's missing is the optional, not-basic, information, and the definition is arguably strong enough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (query, limit, includeContent, maxContentLength) is already documented at the schema level with sensible defaults. The description adds no meaningful information about parameters while also requiring none because the structured definitions do the heavy lifting. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: 'Search the web and fetch complete page content from top results.' It further clarifies its mechanism by explaining it 'follows the resulting links to extract their full page content,' which unambiguously distinguishes it from siblings like get-web-search-summaries and get-single-web-page-content. An agent can understand exactly what this tool does without opening any other definition.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly routes for the lightweight case: 'Use get-web-search-summaries for a lightweight alternative,' giving clear when-to-use guidance and naming the competing tool. It also positions itself as the right choice for comprehensive research. It does not, however, cover the case where a single known URL is already in hand and get-single-web-page-content should be used, so the exclusion guidance is slightly incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate-gdweb-design-indexesA
Automatically use this tool when the user asks to find GDWEB references and create layout analysis, frontend specifications, implementation plans, or DESIGN_INDEX files. This tool applies the dashboard-managed exclusion list, performs the GDWEB search internally, and sends one completely separate MCP sampling/createMessage request per non-excluded result. Each isolated request contains only one result and has no previous-result context. It writes one page-by-page, measurement-first DESIGN_INDEX_gdweb-.md file before starting the next request, then returns only file paths and statuses to the calling LLM. Never replace this tool with search-gdweb-designs plus a combined summary. The connected MCP client must support sampling.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Target award/registration year. Defaults to the current runtime year. | |
| limit | No | Number of isolated result requests and output documents (1-10) | |
| query | Yes | Natural-language design query to search directly on GDWEB | |
| language | No | Language for every generated document. Defaults to English; choose Korean for Korean output. | English |
| awardOnly | No | Whether to require a non-empty GDWEB award field | |
| maxTokens | No | Per-work output budget for a complete multi-page specification (131,072-262,144 tokens; default 131,072) | |
| outputDirectory | No | Directory for generated DESIGN_INDEX files. Defaults to DESIGN_INDEX_OUTPUT_DIR or ./design-index. | |
| includePreviousYear | No | Whether to include the previous year |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full disclosure burden and does so thoroughly. It reveals the internal exclusion list, the isolated per-result MCP sampling requests with no previous-result context, the file-writing sequence, the return format (only paths and statuses), and the client prerequisite of supporting sampling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded, opening with the trigger condition before moving to behavioral details. There is minor redundancy between 'one completely separate MCP sampling/createMessage request' and 'Each isolated request contains only one result,' but every sentence otherwise contributes non-obvious operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, eight parameters, no annotations, and no output schema, the description supplies the essential context: when to use it, how it executes, what it produces, what it returns, and what the client must support. An agent has enough information to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All eight parameters have schema descriptions at 100% coverage, so the schema already documents parameter meaning and defaults. The tool description adds workflow context but no additional parameter-level semantics, matching the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a concrete verb-resource pair: it generates DESIGN_INDEX files from GDWEB references, and explicitly enumerates the deliverables (layout analysis, frontend specifications, implementation plans, DESIGN_INDEX files). It also differentiates the tool from search-gdweb-designs by stating it should never be replaced with that sibling plus a combined summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The first sentence gives an explicit automatic trigger condition: use whenever the user asks for GDWEB references with layout analysis, specifications, plans, or DESIGN_INDEX files. The last sentence provides a clear when-not rule naming the alternative, search-gdweb-designs plus a combined summary, which is exactly the routing an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-single-web-page-contentA
Extract and return the full content from a single web page URL. This tool follows a provided URL and extracts the main page content. Useful for getting detailed content from a specific webpage without performing a search.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL of the web page to extract content from | |
| maxContentLength | No | Maximum characters for the extracted content (0 = no limit, undefined = use default limit). Usually not needed - content length is automatically optimized. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions 'follows a provided URL and extracts the main page content,' but lacks details on failure modes, handling of pagination/dynamic content, rate limits, or response structure. This is a significant gap for a read tool with no annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no fluff. It front-loads the primary action and then immediately provides the use case. Every word earns its place, and it is highly scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple fetch tool, the description is adequate but not complete. It does not describe the return format, error handling, or edge cases (e.g., redirects, large pages). Without an output schema, this missing information is more noticeable, though the tool's simplicity mitigates the impact.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add extra clarification for 'maxContentLength' or 'url' beyond what the schema already provides, but this is acceptable given the schema's completeness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Extract and return the full content from a single web page URL') and distinguishes itself from search tools by noting it is 'without performing a search.' This effectively differentiates it from sibling tools like full-web-search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the tool: when you have a specific URL and want detailed content, as opposed to searching. However, it does not explicitly name alternatives or state when NOT to use it, so it stops short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-web-search-summariesA
Search the web and return only the search result snippets/descriptions without following links to extract full page content. This is a lightweight alternative to full-web-search for when you only need brief search results. For comprehensive information, use full-web-search instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of search results to return (1-10) | |
| query | Yes | Search query to execute (lightweight alternative) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It clearly discloses that the tool only returns snippets and does not follow links, which is useful behavioral context. It could add details about rate limits or exact response shape, but the core behavior is transparent and non-contradictory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. It front-loads the core behavior, then immediately provides usage guidance and the alternative, making every sentence earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with no output schema, the description is complete: it explains what results look like (snippets/descriptions), when to choose it, and how it differs from the primary sibling. The schema covers parameter details, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both 'query' and 'limit' adequately. The description adds contextual framing ('lightweight alternative') but does not add new parameter-level semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Search the web') and precise resource ('return only the search result snippets/descriptions'), clearly distinguishing it from full-web-search. It also names what it does not do: follow links to extract full page content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool ('lightweight alternative... when you only need brief search results') and when not to ('For comprehensive information, use full-web-search instead'). It directly names the main alternative, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search-gdweb-designsA
Use this tool only when the user wants a lightweight list of GDWEB references. It applies the dashboard-managed exclusion list before returning results, returns metadata for multiple results, and does not generate implementation documents. For layout analysis, frontend specifications, DESIGN_INDEX files, or implementation planning, use generate-gdweb-design-indexes instead so every result is processed by a separate isolated LLM request.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Target award/registration year. Defaults to the current runtime year. | |
| limit | No | Number of GDWEB design results to return (1-10) | |
| query | Yes | Natural-language design reference query to search directly on GDWEB | |
| awardOnly | No | Whether to require a non-empty GDWEB award field. Defaults to true. | |
| includePreviousYear | No | Whether to include the previous year in addition to the target year. Defaults to true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It reveals that the tool applies a dashboard-managed exclusion list, returns metadata for multiple results, and does not generate implementation documents. It does not describe response structure or any side effects, but the stated behaviors are meaningful for selection.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The usage condition is front-loaded, followed by behavioral boundaries and the alternative route. Every clause contributes selection or behavioral context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete enough for tool selection and invocation: it explains purpose, usage boundary, exclusion behavior, and non-generation of implementation documents. Since there is no output schema, the exact metadata fields returned are left vague, but this is a minor gap for a lightweight search-list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all five parameters documented in the input schema. The description adds no parameter-level detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific purpose: returning a lightweight list of GDWEB references with metadata, and explicitly contrasts itself with generate-gdweb-design-indexes. It clearly identifies what the tool does and how it differs from the most relevant sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description begins with 'Use this tool only when the user wants a lightweight list of GDWEB references,' giving an explicit trigger condition. It then names the alternative tool and the conditions under which that sibling should be used, providing clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
5 tool updates
v0.6.0- First observed
full-web-search - First observed
generate-gdweb-design-indexes - First observed
get-single-web-page-content - First observed
get-web-search-summaries - First observed
search-gdweb-designs
TDQS
The tools are largely distinct: full-web-search and get-web-search-summaries are explicit alternatives for comprehensive vs lightweight results, and get-single-web-page-content handles a specific URL without searching. The two GDWEB tools could be confused at first glance, but their descriptions strongly differentiate metadata listing from file generation.
Most tools follow a hyphenated verb-noun pattern (search-gdweb-designs, generate-gdweb-design-indexes, get-web-search-summaries, get-single-web-page-content). The exception is full-web-search, which uses an adjective-noun form rather than a verb, creating a minor inconsistency.
Five tools is a well-scoped set for a web search and GDWEB reference server. Each tool has a distinct role—comprehensive search, snippet search, single-page fetch, lightweight GDWEB listing, and GDWEB index generation—so none feel redundant.
The surface covers the core workflows: broad web search with two detail levels, direct page extraction, and the specialized GDWEB design-index generation pipeline. Minor gaps exist around managing the dashboard exclusion list or retrieving previously generated index files, but agents can work around these.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Focused full-screen UI references and hosted design materials for coding agents.
A design-style library for AI agents: search real styles, fetch a ready-to-apply design spec.
Curated design references for AI — real CSS values, typography specs, and color palettes.
Serves your design system and coding standards to coding agents, so they stop guessing.
Related MCP Servers
- FlicenseAqualityDmaintenanceProvides comprehensive design principles and best practices to help LLMs generate modern, accessible web pages through guidance on layouts, colors, and typography. It enables users to review design approaches and access expert recommendations for responsive design, component structure, and current industry trends.12323-

Refero MCPofficial
AlicenseAqualityBmaintenanceEnables searching the Refero design catalog in plain English and generates DESIGN.md files for any project.68313MIT- AlicenseNot gradedqualityBmaintenanceCaptures website design evidence across responsive conditions and packages it into a portable design system for reuse by other agents.2MIT
- AlicenseNot gradedqualityCmaintenanceProvides curated real website design references with structured JSON data on type, spacing, palette, and layout. Enables AI agents to search, browse, and analyze over 1,000 sites and their sections.1MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/yyeongjin/secret_mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server