원클릭으로
research-connector
Systematic process for researching unknown Tray connectors via DDL discovery
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Systematic process for researching unknown Tray connectors via DDL discovery
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Build or modify Tray workflows. Use this skill whenever the user asks to create, build, or modify a workflow — including requests like "build a workflow that...", "create a workflow to...", "set up an integration between...", "automate X", or "modify the workflow that...". Examples of when this skill MUST be loaded: - "Build a workflow that syncs Salesforce leads to Slack" - "Create a scheduled job that sends a daily email report" - "Set up an integration between HubSpot and Google Sheets" - "Modify the existing lead scoring workflow to add error handling" - "I have a Workato recipe — can you recreate it in Tray?" This skill is the entry point for ALL workflow creation and modification. Load it BEFORE making any create_workflow, add_workflow_steps, or update_workflow_steps calls.
Build or modify Tray workflows. Use this skill whenever the user asks to create, build, or modify a workflow — including requests like "build a workflow that...", "create a workflow to...", "set up an integration between...", "automate X", or "modify the workflow that...". Examples of when this skill MUST be loaded: - "Build a workflow that syncs Salesforce leads to Slack" - "Create a scheduled job that sends a daily email report" - "Set up an integration between HubSpot and Google Sheets" - "Modify the existing lead scoring workflow to add error handling" - "I have a Workato recipe — can you recreate it in Tray?" This skill is the entry point for ALL workflow creation and modification. Load it BEFORE making any create_workflow, add_workflow_steps, or update_workflow_steps calls.
Systematic process for researching unknown Tray connectors via DDL discovery. Use when you need to discover a connector's version, operations, auth, required fields, and DDL-resolved values before building a workflow step.
Load when adding workflow steps, picking a trigger, or wrapping step properties — covers core connector names and versions (including the non-obvious `noop`/`scheduled`/`callable-trigger` trigger names), the type-wrapper format, connector-name-only step naming, and common jsonpath shapes (loop `value`, callable `response`).
Load when debugging a Tray workflow error or working with known-weird surfaces — `raw_http_request` input format, `has_dynamic_output` rules, `trigger-reply`'s empty inputSchema, callable workflow sync/async pairing, jsonpath output-shape differences across step types, scheduled-trigger `day_of_week` explicit-keys rule, Salesforce custom (`*__c`) field picklist values, and stale `version_id` recovery.
Load when structuring a workflow — branches, loops (the `_loop` wrapper), callable workflows (sync vs async + the `callable-workflow-response` pairing), scheduled triggers (the full `day_of_week` object), manual error handling (`error_handling: "manual"` + `update_workflow_structure`), and the mandatory version_id chaining across mutations.
| name | research-connector |
| description | Systematic process for researching unknown Tray connectors via DDL discovery |
| disable-model-invocation | false |
| argument-hint | [connector-name] |
This skill is the fallback path for direct connector research from the parent agent — useful for trivial lookups (single small operation, no DDL fields, no polymorphism) or for ad-hoc exploration. For real workflow builds, prefer delegating to the Researcher subagent (see /tray-workflows:build-workflow#step-2-research-connectors); the subagent absorbs verbose schemas and returns a step-level prescriptive result, keeping the parent's context lean.
If you do follow this process directly, the schemas you see from list_connector_operations are compacted by default — advanced fields stripped, polymorphic branches replaced with _collapsed markers carrying expand: ['<propName>'] hints. Echo a hint verbatim into the next call's expand array when you actually need a collapsed branch; otherwise leave it collapsed. Pass include_advanced: true only when an advanced field is genuinely required, and include_output_schema: false for terminal steps where nothing downstream consumes the result.
Follow this process exactly. Do NOT skip steps or guess field values.
Immediately stop and ask the user if:
Call list_connectors with search term "$ARGUMENTS". Record exact name, version, and service details. When multiple versions exist, use the latest.
Use the connector's service name (from Step 1's connector.service.name — e.g. google-sheets, slack, salesforce) to filter authentications. Always prefer service_name over keyword search — auth display names are user-supplied (e.g. an auth named "Sheets" backs service.name === "google-sheets") and keyword search by name routinely misses the right auth.
list_authentications(service_name: "<connector.service.name>")
If 0 matches, fall back to a no-filter call to see every auth in the workspace. Don't reach for keyword search — it's the same fragile path. Present existing auths to the user — reuse if suitable. Only create new auth if none exist or user requests it.
To create new auth (parameter names are unintuitive — follow exactly):
list_service_environments with service_name (string, e.g., "google-gmail") and service_version (integer from list_connectors → service.version) — NOT service_idcreate_auth_collection with service (UUID from step 1's response), service_environment_id (from step 1's id field), and scopes — NOT connector_name/connector_versioncheck_auth_completion| Parameter | Source | Common mistake |
|---|---|---|
list_service_environments.service_name | list_connectors → service.name | Using service_id instead |
list_service_environments.service_version | list_connectors → service.version (integer) | Passing as string |
create_auth_collection.service | list_service_environments → service (UUID) | Using connector_name |
create_auth_collection.service_environment_id | list_service_environments → id | Omitting entirely |
Call list_connector_operations for the discovered connector. The response is compacted by default — read carefully:
inputSchema.required — mandatory fieldsinputSchema.properties — field types and constraintshasDynamicOutput — needed for call_connector callslookup objects on individual fields — these reveal private DDL operations_collapsed markers — a property whose body is replaced by a string of the form "oneOf with N variants (...); pass expand: ['<name>'] to retrieve in full" (or "array items: object with N properties; …"). If the workflow needs that branch, re-call with the named property in the expand array. If it doesn't, leave it collapsed.For fields with lookup objects, extract the private DDL operation name from lookup.body.message and call it via call_connector.
Key points:
list_connector_operations but ARE callablelookup.body.step_settingshas_dynamic_output: falseprivate_list_*, *_ddl, list_*_options, get_*_valuesDo NOT blindly test every operation with call_connector. The tool is gated server-side to protect production auths. Only call it in these cases:
operationType === 'private' or referenced as lookup.body.message from another op): call it to discover field values (handled in Step 4).hasDynamicOutput: true: call it with has_dynamic_output: true so the server returns returnOutputSchema: true. This reveals the real output shape, which you need to build correct jsonpaths.inputSchema (and outputSchema if static) to the user in the summary and move on. Regular mutating operations (create_record, send_message, etc.) can have real side effects with production auths and are billable per call — the user will test them in their own way.If a user explicitly asks you to call a non-DDL, non-dynamic-output operation (e.g., "try this raw_http_request"), pass allow_unsafe: true. Never set allow_unsafe silently or in a loop.
For any field values not discoverable via DDL, ask the user explicitly. Examples:
Before proceeding to workflow creation, verify:
inputSchema.requiredhasDynamicOutput discovery or the static outputSchema) — do NOT test-fire mutating operationshas_dynamic_output value noted for each operation