协作头脑风暴
brainstorming
在实现前澄清需求、探索设计选择,并形成清晰的开发方向。
tres-settings-management【开发与工程】Manage Organization Settings and Platform Settings via the TRES MCP GraphQL API. Use when users ask about org settings, platform settings, configuration, feature flags, enable/disable platforms, balance diff, commit strategy, cost basis, ERP, pricing, sync boundaries, or any setting read/write operation. Trigger phrases include "get settings", "show …
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
This skill lets users view and modify configuration for their TRES Finance organization and individual blockchain/exchange platforms. There are two levels:
Before doing anything, confirm which organization the user is connected to:
query { admin { orgName } }
Tell the user: "You're connected to {orgName}."
Before any mutation, ALWAYS fetch the current value of the setting(s) being changed. Show a clear before/after comparison.
Before executing ANY mutation, you MUST:
Flag these settings as potentially dangerous and add a warning:
costBasisStrategy — Changing mid-period can cause recalculations across the entire orgdisableAutoCommit — Stops all automatic data processingskipCostBasis — Disables cost basis entirelycommitStrategy: SKIP_ALL — Fully disables a platform's data pipelineenableMultiEntity — Structural change, hard to reverseallowShort — Enables short positions in cost basisDo NOT rely on hardcoded field lists. Use the MCP introspect tool to discover available fields and their types dynamically:
introspect("OrganizationSettingsObjectType") — all readable org settingsintrospect("setOrganizationSettings") — all writable org settings with descriptionsintrospect("PlatformSettingsObjectType") — all readable platform settingsintrospect("setPlatformSettings") — all writable platform settings with descriptionsWhen a user asks "what can I configure?" or you need to verify a field name or enum values, introspect first.
If the user says "show me the settings" without specifics, offer these categories with plain-language explanations:
| Category | What It Controls |
|---|---|
| Cost Basis | How gains/losses are calculated (FIFO, LIFO, etc.), per-wallet vs org-wide, impairment |
| Commit Pipeline | Automatic data processing schedule, priority, stuck detection, sync hours |
| Internal Transfers | How transfers between the org's own wallets are detected and matched |
| Pricing | Where asset prices come from, stablecoin pegging, swap alignment |
| ERP Integration | How data syncs to accounting systems (NetSuite, Xero, QuickBooks) |
| Dashboard & Features | Which UI features are enabled (pivot tables, vesting, payments, multi-entity) |
| Staking | Staking rewards tracking and position management |
| Reconciliation | Cross-org and subsystem reconciliation behavior |
| Reports | Scheduled report timing, format, and content |
| Platform Collection | Which blockchains/exchanges are enabled, their sync boundaries and filters |
query {
admin {
orgName
organizationSettings {
# include only the fields relevant to the user's question
}
}
}
introspect("OrganizationSettingsObjectType") to discover available fields if neededThese fields return objects/lists, not scalars. Always include their sub-fields:
| Field | Sub-fields | What It Is |
|---|---|---|
peggedStableCoinsToFiat | assetName, currency | Stablecoins treated as equivalent to fiat |
pricingApiSourcePerAsset | assetName, pricingApiSource | Custom pricing source per asset |
netsuiteCurrencySymbolToInternalId | currency, internalId | NetSuite currency mapping |
simpleMatchingStrategies | beforeRange, afterRange | Reconciliation time windows |
proofOfFunds | organizationName | Proof of funds client config |
The admin query also provides:
orgName — the organization's display namedisabledPlatforms — quick list of platforms with collection fully disabledauth0Connections — available SSO login methodsUses patch semantics — only include the fields you want to change. Everything else stays as-is.
mutation {
setOrganizationSettings(
costBasisStrategy: FIFO
) {
organizationSettings {
costBasisStrategy
}
}
}
Use introspect("setOrganizationSettings") to discover all mutable fields, their types, and descriptions.
Returns only platforms/accounts with explicit overrides. Platforms using all defaults won't appear.
query {
platformSettings(platform: ETHEREUM) {
results {
settingsId
platform
internalAccountId
platformSettings {
commitStrategy
calculateBalanceDiff
minLastSyncedAt
maxToDate
# add fields as needed — use introspect("PlatformSettingsObjectType") for full list
}
}
}
}
All arguments are optional — combine as needed:
| Argument | Type | Use Case |
|---|---|---|
platform | Platform | Show settings for a specific chain/exchange |
internalAccountId | Int | Show settings for a specific wallet |
settingsId | String | Exact match on storage key |
settingsId_Icontains | String | Partial match (e.g., "ethereum" matches "ethereum_714128") |
platform only → platform-wide + all per-wallet overrides for that platformplatform + internalAccountId → only the per-wallet overrideinternalAccountId only → all platforms for that walletquery { admin { disabledPlatforms } }
Patch semantics — only included fields are merged. Existing values preserved.
mutation {
setPlatformSettings(
platform: ARBITRUM
internalAccountId: 714128 # omit for platform-wide
commitStrategy: FULL
minLastSyncedAt: "2025-01-01T00:00:00+00:00"
) {
settingsId
platformSettings {
commitStrategy
minLastSyncedAt
}
}
}
Use introspect("setPlatformSettings") to discover all available arguments.
platform (required) — target blockchain or exchangeinternalAccountId (optional) — scope to a specific wallet. Omit for platform-wide"2025-01-01T00:00:00+00:00"To enable balance-diff-based activity tracking for specific assets:
mutation {
setPlatformSettings(
platform: ARBITRUM
internalAccountId: 714128
balanceRollupSettings: {
assetIdentifiers: ["native"]
interval: DAILY
}
) {
settingsId
platformSettings {
balanceRollupSettings { assetIdentifiers interval }
}
}
}
assetIdentifiers can be "native" for the chain's native asset, or contract addresses for tokens.
Use setPlatformCollectionStatus (not setPlatformSettings) for simple enable/disable.
mutation {
setPlatformCollectionStatus(
platformCollectionStatuses: [
{ platform: ARBITRUM, enabled: true }
{ platform: POLYGON, enabled: false }
]
) {
success
}
}
enabled: true → platform will be collected in commits (FULL)enabled: false → platform is fully skipped (SKIP_ALL)Supports bulk operations — multiple platforms in one call.
When the user provides a wallet address, look up the internal account ID:
query {
internalAccount(identifier: "0x1887fa9edadeab7562b01cc3f4fa246ace2c3cdd") {
results {
id
name
identifier
parentPlatform
}
}
}
Use the returned id as internalAccountId in platform settings mutations.
Note: parentPlatform represents the top-level chain family (e.g., ethereum covers Ethereum, Arbitrum, Polygon, etc.). A single wallet address on ethereum parentPlatform can have platform-specific settings for each L2.
admin { organizationSettings { costBasisStrategy } }setOrganizationSettings(costBasisStrategy: LIFO)admin { disabledPlatforms } — confirm ARBITRUM is in the listsetPlatformCollectionStatus(platformCollectionStatuses: [{platform: ARBITRUM, enabled: true}])internalAccount(identifier: "0x...") → get idplatformSettings(platform: POLYGON, internalAccountId: {id}) → get minLastSyncedAtsetPlatformSettings(platform: POLYGON, internalAccountId: {id}, minLastSyncedAt: "2025-01-01T00:00:00+00:00")internalAccount(identifier: "0x...") → get idplatformSettings(platform: ETHEREUM, internalAccountId: {id})setPlatformSettings(platform: ETHEREUM, internalAccountId: {id}, balanceRollupSettings: {assetIdentifiers: ["native"], interval: DAILY})admin { disabledPlatforms }admin { organizationSettings { pricingApiSource peggedStableCoinsToFiat { assetName currency } pricingApiSourcePerAsset { assetName pricingApiSource } } }| Error | Meaning | Resolution |
|---|---|---|
| 403 / Permission denied | User lacks admin:* permission | Contact org admin to grant access |
Empty platformSettings results | No custom overrides — platform uses defaults | This is normal; explain that defaults apply |
| "does not exist for organization" | Internal account ID not found in this org | Verify the wallet address and re-resolve |
| Invalid enum value | Wrong value for a setting | Use introspect on the enum type to show valid options |
| DateTime parse error | Wrong format | Must be ISO 8601 with timezone: "2025-01-01T00:00:00+00:00" |