Husky Home Finder MCP Server
Click on "Deploy 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., "@Husky Home Finder MCP Serveranalyze all forms"
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.
Submission Reviewer MCP Server
The Husky Home Finder collects student submissions (apartment reviews, roommate interest, housing survey, and newsletter/waitlist sign ups.)
Currently, we would need to read each submission manually to catch duplicates, incomplete responses, and other bad submissions.
This MCP server adds AI review between submission and the database in order to classify the submissions, extract the data, summarize the information, and check for duplicates.
How Codex and GPT 5.6 were used
Codex was used as the main builder, building the MCP server (the tools, the typescript source (src), and the mock JSON data). I told Codex what I wanted each tool to do and then reviewed it, editing it based on the output.
GPT 5.6 is called, and powers two of the four tools: classifying submissions and extracting fields from the text reviews.
The other two tools (dedupe_check and summarize_batch) don't use AI calls, they are rule-based.
Related MCP server: Docalyze
What it does
The server exposes exactly four tools:
Tool | Plain-language purpose | What it returns |
| Helps staff spot incomplete, inconsistent, or potentially duplicate form responses before reviewing them manually. | GPT-5.6 data-quality classifications for redacted records in one form. |
| Turns free-text apartment reviews into consistent fields that a future directory or dashboard can use. | GPT-5.6 structured quality, amenity, and concern data from apartment-review text. |
| Finds submissions that may be repeats, so staff do not need to review the same response twice. | Likely duplicate submission IDs using a form-specific matching rule. |
| Gives the team a quick picture of trends, such as budgets, neighborhoods, ratings, or housing concerns. | Privacy-preserving aggregate counts, averages, and common choices for one form. |
The mock data deliberately includes ordinary valid submissions, likely duplicates, incomplete responses, and invalid values so the tools have useful results immediately.
Project layout
src/
index.ts MCP server and tool registration
call-tool.ts Small local MCP client for manual testing
data.ts Reads mock JSON data (replace this later for a database)
analysis.ts Duplicate detection and aggregate summaries
openai-analysis.ts Redacted GPT-5.6 classification and field extraction
types.ts Form data types
mock-data/ One JSON file for each form typeSetup
You need Node.js 20 or newer.
npm install
npm run buildTest a tool manually
The call command compiles the project, starts the server, calls one tool, prints its JSON result, and stops.
# Summarize a batch of housing surveys
npm run call -- summarize_batch --form housing_survey
# Find repeated roommate-interest submissions
npm run call -- dedupe_check --form roommate_interestThe AI tools require an API key. Copy .env.example to .env, add OPENAI_API_KEY, and use:
# Classify records for human data-quality review
npm run call:ai -- classify_submission --form roommate_interest
# Extract structured fields from apartment reviews
npm run call:ai -- extract_fields --limit 10
# Analyze one newly pasted apartment review instead of mock data
npm run call:ai -- extract_fields --text "The apartment is close to campus, but our unit had recurring plumbing problems."
# Classify one newly pasted housing-survey response
npm run call:ai -- classify_submission --form housing_survey --text "I live on campus, have a $1400 monthly budget, and want housing near the University District."For pasted text, omit names, email addresses, phone numbers, and other direct identifiers. The server also redacts common email and phone-number patterns before making an AI request.
Form results also include a formOverview object so outside users understand what each form category represents:
Form type | What it covers |
| Current housing, budget, preferred neighborhoods, and concerns. |
| Building quality, rent, room type, rating, and written student experience. |
| Move-in timing, budget, lifestyle preferences, and a short student bio. |
| Interest in Husky Home Finder updates and housing resources. |
Run as an MCP server
After building, start the standard-input/output server with:
npm startFor an MCP client configuration that uses the AI tools, start it with the environment file loaded:
npm run build
npm run start:aiMCP uses standard output for protocol messages. The server sends status messages to standard error, so do not add ordinary console.log statements to src/index.ts.
An MCP client can register the compiled server with:
{
"command": "node",
"args": ["/absolute/path/to/submission-reviewer/dist/index.js"]
}Privacy and MVP notes
This is a learning MVP, not production storage for real student data. The AI tools redact names, email addresses, and phone numbers before sending records to the provider. Classification and duplicate results are review aids, never automatic housing or roommate decisions.
Before collecting real submissions, add authentication and authorization, encrypted database storage and backups, consent and retention rules, rate limiting, audit logs, and a human review process.
Where to make changes later
Add or change a form field: update
src/types.ts, its JSON fixture, and summary or extraction logic.Use a database: replace
loadSubmissionsinsrc/data.ts; the tools can stay the same.Adjust duplicate matching: edit
dedupeCheckinsrc/analysis.ts.
Available Tools
4 toolsclassify_submissionA
Use GPT-5.6 to classify a form's redacted submissions for human review. Provide text to classify one new pasted submission; omit it to analyze mock data. AI labels are suggestions, never automatic decisions.
| Name | Required | Description | Default |
|---|---|---|---|
| form | Yes | ||
| text | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses the AI model (GPT-5.6), that labels are suggestions only, and the mock data behavior. Could mention rate limits or authentication but covers key safety cues.
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, no redundancy, front-loaded with purpose. Every sentence adds value.
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 classification tool with two params and no output schema, the description covers purpose, behavior, and parameter usage. Missing output format details, but sufficient for basic use.
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 0%, so description must compensate. It explains the 'text' parameter (optional, for new submission or mock data) but does not clarify the 'form' enum values beyond the schema itself. Partial compensation.
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 tool classifies a form's redacted submissions using GPT-5.6. It distinguishes from siblings (dedupe, extract, summarize) and specifies the action and resource explicitly.
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 gives operational guidance (provide text or omit for mock data) but does not compare with sibling tools or state when not to use this tool. Usage context is implied but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dedupe_checkB
Find likely duplicate mock submissions using a form-specific matching rule.
| Name | Required | Description | Default |
|---|---|---|---|
| form | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the burden for behavioral details. It only says 'find', which implies read-only, but does not clarify idempotence, side effects, permissions, or output format. This is insufficient for an agent to understand the tool's impact.
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 a single, well-structured sentence with no filler words. It is front-loaded with the main action.
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 one-parameter tool with no output schema, the description should at least hint at the return value (e.g., a confidence score or list of duplicates). It omits this, relying on the user to infer the output.
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?
The description adds the concept of a 'form-specific matching rule', linking the 'form' parameter to the matching logic. However, it does not explain the enum values or their effect, missing an opportunity given 0% schema coverage.
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 tool finds duplicate submissions using a matching rule, with a specific verb and resource. It is distinct from sibling tools that classify, extract, or summarize.
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?
No guidance on when to use this tool versus alternatives or any prerequisites. The description does not mention sibling tools or provide context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_fieldsA
Use GPT-5.6 to extract structured quality, amenity, and concern data from apartment-review text. Provide text to process one new review; omit it to process mock reviews. No contact details are sent.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the use of GPT-5.6 and states that no contact details are sent. No annotations are present, but the description does not cover side effects or mutation behavior, leaving some ambiguity.
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 that are dense and front-loaded. Every sentence adds value without verbosity.
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?
Covers the main purpose and provides a usage hint, but lacks description of the return format or behavior for the 'limit' parameter. No output schema exists, so more detail would help.
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?
The description partially explains the 'text' parameter (provide for new review, omit for mock) but gives no details about the 'limit' parameter (integer, default 25). With 0% schema coverage, this is insufficient.
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 verb 'extract' and the resource 'structured quality, amenity, and concern data from apartment-review text'. It distinguishes from sibling tools like classify_submission and summarize_batch by focusing on extraction.
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?
Provides guidance on when to provide text (for a new review) vs. omit it (for mock reviews). However, it lacks explicit when-not-to-use directives or mentions of alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
summarize_batchB
Create a privacy-preserving aggregate summary for a single form type.
| Name | Required | Description | Default |
|---|---|---|---|
| form | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility. It mentions 'privacy-preserving' but does not disclose whether the tool reads or mutates data, or any permission or rate limit considerations.
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 a single sentence that is succinct and front-loaded, conveying the essential purpose without extraneous words.
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 simplicity (1 parameter, no output schema), the description is adequate but does not explain what 'aggregate summary' means or what the return format is. It lacks completeness but is minimally viable.
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?
The description echoes the parameter by mentioning 'single form type', but adds no additional meaning beyond the schema-provided enum. With 0% schema coverage, the description does not compensate, though the single parameter is self-explanatory.
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 tool creates a privacy-preserving aggregate summary for a single form type, using a specific verb and resource. It effectively distinguishes from siblings like classify_submission, dedupe_check, and extract_fields, which have different purposes.
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?
No guidance on when to use this tool versus alternatives. The description does not specify context, exclusions, or prerequisites for usage.
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.
4 tool updates
v1.0.0- First observed
classify_submission - First observed
dedupe_check - First observed
extract_fields - First observed
summarize_batch
TDQS
Scored across 4 tools
Each tool has a distinct purpose: classification, deduplication, field extraction, and summarization. No overlap or ambiguity.
All tool names follow a consistent verb_noun snake_case pattern: classify_submission, dedupe_check, extract_fields, summarize_batch.
4 tools is an appropriate size for a focused analysis server, covering key operations without redundancy.
The tool set covers the main analytical workflow for apartment reviews: classification, dedup, extraction, and summarization. No obvious gaps for the stated purpose.
Maintenance
Related MCP Connectors
Public MCP server for discovering open jobs. Search, filter, and get application links.
MCP server for FormBro Canadian immigration application automation.
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
Remote MCP server for supportsheep: run AI interviews and manage support content for your blog.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceLight-weight MCP server to save and manage apartment listings to a shared Google Sheet.MIT
- AlicenseBqualityDmaintenanceAn MCP server that lets AI assistants read and visually analyze local documents — PDFs, Excel spreadsheets, CSV files, Word documents, PowerPoint presentations, and images.442 npm53 PyPIMIT
- AlicenseNot gradedqualityCmaintenanceMCP server that provides intelligent student assistance tools for academic calculations, attendance tracking, marks analysis, and syllabus reading via Groq LLM.18 npm1MIT
- FlicenseNot gradedqualityCmaintenanceMCP server for querying student information, validating result data, and analyzing student results from a local database.-