MSW Search
MSW has two distinct search targets. They behave differently, so they are covered in separate sections.
- API docs & implementation guides — Vector search that provides the details, code examples, related APIs, and implementation guidance that lacks.
- Resources — REST API to search and browse sprites, animations, sounds, resource packs, and avatars. The only path for obtaining RUIDs.
Routing Table
| Request type | Go to section |
|---|
| "How do I implement this?", "Show me an example", "What related APIs exist?" | Document search |
| ".d.mlua only has the signature; the description is insufficient" | Document search |
| "I don't know the API name (semantic search)" | Document search () |
| "Implementation guide / best practice / pattern" | Document search () |
| "I need a SpriteRUID", "Find a sprite for monster / NPC / background" | Resource search |
| "Find an animation / sound / resource pack" | Resource search |
| "Details for this RUID", "Similar resources" | Resource search |
| "Avatar rendering / default avatar" | Resource search |
Section 1 — Document Search (APIs & Guides)
Vector search that supplies the
detailed descriptions, code examples, related APIs, and implementation guides missing from
.
Access Methods
The same vector search backend can be accessed through two paths. Results are identical.
| Method | Condition | Usage |
|---|
| MCP tool | is connected | Call , |
| Direct curl | Fallback when MCP is not connected | curl "http://10.10.200.51:31817/search?q=...&type=...&limit=..."
|
Decision Flow
Need API-related information
│
├─ Checking signature / type / property / enum
│ → Read .d.mlua first (highest priority)
│ → If .d.mlua is insufficient, use vector search
│ (code examples, parameter details, related APIs, etc.)
│
├─ Implementation guide / pattern / best practice
│ → Vector search (type=document)
│
├─ Don't know the API name (semantic search)
│ → Vector search (type=both)
│
└─ How to access vector search:
├─ msw-guide-mcp connected? → MCP tool
└─ Not connected → curl
API Research Order
Priority 1 — .d.mlua (always first)
If you know the API name,
always read first. Signatures, types, properties, event parameters, and enum values can be confirmed here accurately.
Path:
Environment/NativeScripts/{Component,Service,Event,Enum,Logic,Misc}/Name.d.mlua
| Situation | Example |
|---|
| Confirm method signature | "Does TransformComponent have SetPosition?" |
| Property type / existence | "What is the type of SpriteRendererComponent.RUID?" |
| Event parameter structure | "What are the AttackEvent constructor parameters?" |
| List of enum values | "What are the BodyMoveType values?" |
| Method existence | "What methods does SpawnService have?" |
Priority 2 — Vector search (when .d.mlua is not enough)
contains only signatures and
lacks detailed descriptions and examples. Use vector search when you need any of the following.
| Situation | Search type | Example query |
|---|
| Need a code example | | , |
| Parameter details | | BadgeService GetBadgeInfosAndWait parameters
|
| Related API cross-references | | , |
| ScriptOverridable check | | AttackComponent CalcCritical override
|
| Don't know the API name | | , |
| "How do I …?" implementation guide | | how to make inventory system
|
| Pattern / best practice | | collision detection best practice
|
MCP Tool Usage
| Tool | Maps to type | Description |
|---|
| | API details for Service / Component / Misc etc. (signatures, parameters, examples) |
| | Authoring manuals, guidelines, MLua usage, and other document-style material |
Tool names and parameters follow the latest MCP schema.
Connection check: If a tool call errors out, it is not connected — fall back to curl.
Direct curl Usage
GET http://10.10.200.51:31817/search?q={query}&type={type}&limit={limit}
| Parameter | Required | Value | Description |
|---|
| O | string | Search query (natural language or API name) |
| X | | | | Search scope (default: ) |
| X | integer | Max results (default: 5) |
How to choose
| Intent | type |
|---|
| Specific API spec (parameters, return type, example) | |
| Implementation guidance (how-to, tutorial, concept) | |
| Ambiguous or broad scope | |
Usage Examples
bash
# Specific API details + example
curl "http://10.10.200.51:31817/search?q=AIComponent&type=api&limit=5"
# Implementation guide
curl "http://10.10.200.51:31817/search?q=how+to+make+an+inventory+system&type=document&limit=5"
# Semantic search (when exact API name is unknown)
curl "http://10.10.200.51:31817/search?q=collision+detection&type=both&limit=10"
Response Format
json
{
"results": "formatted text with matching documents (title, section, content)"
}
Error Handling
| Code | Meaning | Action |
|---|
| Service is starting up | Retry after a short wait |
| Internal error (OpenSearch) | Fall back to files |
| Connection failure | Service not running | Fall back to files |
.d.mlua vs Search — Information Comparison
is a type stub (~29 lines); Search returns the full document (254+ lines).
| Information | .d.mlua | Search |
|---|
| Method signature / types | O | O |
| Property declarations | O | O |
| Detailed method description (DetailDesc) | X | O |
| Code examples (AdditionalPageContent) | X | O |
| Per-parameter descriptions | X | O |
| Related APIs (SeeAlsoAPIs) | X | O |
| Related guides (SeeAlsoGuides) | X | O |
| ScriptOverridable flag | X | O |
| SyncDirection | Partial | O |
| Localized descriptions (Ko/Ja/Es/Zh) | X | O |
Maker Editor Syntax → .mlua Conversion Rules
Code examples in search results use
Maker Editor syntax. They must be converted before being used in a local
file.
| Item | Maker Editor | .mlua file | Note |
|---|
| Override declaration | override integer CalcDamage(...)
| method integer CalcDamage(...)
| → |
| Block | | | Braces → |
| Exec space | or omitted | | Annotation must be explicit |
| Property | Property: int32 Score = 0
| @Sync property int32 Score = 0
| Add if synced |
| Type | | | C# int → mlua integer |
| Type | | | Same (double) |
| Type | | | Same (single) |
(64-bit double) and
(32-bit single) are assignable to each other but remain distinct types. Follow the
declaration.
Conversion example — AttackComponent from search results:
-- Maker Editor syntax (search result)
override int CalcDamage(Entity attacker, Entity defender, string attackInfo) {
return 50
}
override boolean CalcCritical(Entity attacker, Entity defender, string attackInfo) {
return _UtilLogic:RandomDouble() < 0.3
}
lua
-- Converted to .mlua
@ExecSpace("ServerOnly")
method integer CalcDamage(Entity attacker, Entity defender, string attackInfo)
return 50
end
@ExecSpace("ServerOnly")
method boolean CalcCritical(Entity attacker, Entity defender, string attackInfo)
return _UtilLogic:RandomDouble() < 0.3
end
Section 2 — Resource Search (Sprite / Animation / Sound / Resource Pack / Avatar)
REST API for searching and browsing MSW resources.
Never guess or fabricate a RUID — always obtain one through this API.
Base URL
https://resourcesearch-api.future.msw.nxdev.kr
- No authentication (public API)
- All endpoints use the prefix
- Content-Type:
application/json; charset=utf-8
(for POST requests)
- Recommended timeout: 15 seconds
POST body rule — always use a temp file, never inline
For
every POST endpoint in this section (
,
,
), write the JSON body to a temp file first
and call curl with
:
bash
REQ="$TMPDIR/msw_req.json"
cat > "$REQ" <<'JSON'
{ "query": "주황버섯", "types": ["resource_pack"], "categories": ["mob"], "limit": 5 }
JSON
curl -s -X POST https://resourcesearch-api.future.msw.nxdev.kr/v3/search/resources \
-H "Content-Type: application/json; charset=utf-8" \
--data-binary "@$REQ"
Why: passing JSON inline (
-d '{"query":"주황버섯",...}'
) frequently breaks on
non-ASCII input (Korean / Japanese / Chinese / emoji). The shell re-encodes the
argument and the server returns:
{ "detail": "There was an error parsing the body" }
The temp-file pattern also sidesteps the extra quoting/escaping required on Windows
(PowerShell, Git Bash). Apply it uniformly even when the body is ASCII-only, so the
recipe stays identical across platforms and languages.
On Windows PowerShell, use
instead of
and write the file with
Set-Content -Encoding utf8
(or
).
The
part is unchanged.
Resource Types
| type | Description |
|---|
| Static image (PNG) |
| Frame-based animation |
| Finished asset bundling sprites + animations + sounds |
| Sound / audio clip |
Categories
| category | Description |
|---|
| Monster |
| NPC |
| Map / background / terrain |
| Item |
| Effect |
| Skill |
| UI element |
RUID
A 32-character hex string that uniquely identifies every resource. Example:
"0017da7385e04bc4b2ddbe5949b4b462"
- The field in search results is the RUID
- is a separate Unity asset GUID (used in )
- Never guess or fabricate a RUID — always obtain it from an API response
Common Response Fields
json
{
"id": "32-char hex RUID",
"type": "sprite|animationclip|resource_pack|sound",
"category": "mob|npc|map|item|effect|skill|ui",
"names": {
"ko": ["Korean name"],
"en": ["English name"]
},
"assetGuid": "Unity asset GUID (may or may not exist)",
"payload": {
"width": 64,
"height": 64,
"thumbnail": "https://...",
"pivot": {"x": 32, "y": 32},
"frames": [],
"elements": []
}
}
Endpoint Summary
| Method | Endpoint | Purpose |
|---|
| POST | | Natural-language semantic search |
| GET | /v3/search/resources/similar/{ruid}
| Find similar resources |
| GET | | Single resource details |
| POST | | Batch fetch multiple resources |
| GET | /v3/resources/tags/{ruid}
| AI-generated multilingual tags |
| GET | | List by type / category |
| GET | | Random resource recommendation |
| GET | /v3/resources/packs/{pack_id}
| Resource pack details + components |
| GET | | Default avatar body / head RUIDs |
| GET | | Avatar item details |
| POST | | Render an avatar |
Resource Routing Guide
| Situation | Endpoint to use | Reference file |
|---|
| "Find a slime sprite" | POST /v3/search/resources
| references/resource/search.md
|
| "Any more monsters like this one?" | GET /v3/search/resources/similar/{ruid}
| references/resource/search.md
|
| "Details for RUID abc123" | | references/resource/detail.md
|
| "Show me a list of monster sprites" | | references/resource/browse.md
|
| "What's inside this resource pack?" | GET /v3/resources/packs/{pack_id}
| references/resource/browse.md
|
| "Render an avatar" | | references/resource/avatar.md
|
Typical Workflow
1. Semantic search (POST /v3/search/resources) → obtain RUID
2. Detail lookup (GET /v3/resources/{ruid}) → inspect payload
3. For resource packs → pack details (GET /v3/resources/packs/{pack_id}) → individual element RUIDs
4. Assign the individual RUID to SpriteRendererComponent.SpriteRUID
For detailed Request/Response of each endpoint, refer to the files under .
Shared Tips
- Keyword choice — Use the exact name if you know it; natural-language Korean/English also works.
- Adjust — Use a larger value (10+) for broad exploration, smaller (3) for precise lookups.
- When search fails:
- Document search fails → read directly and check JSON.
- Resource search fails → retry with synonyms or a different category; browse with by type/category.
- returns
{"detail":"There was an error parsing the body"}
→ you almost
certainly used inline with a non-ASCII value. Switch to the temp-file
pattern () described in Section 2.
- Composite queries are allowed — e.g.
AttackComponent CalcCritical
for docs, for resources.
- No guessing — Never guess API names, RUIDs, or enum values; always confirm via search or references.