MCP 서버

SNHP — free negotiation math + agent memory

io.github.ryuxik/snhp
비즈니스 및 운영 공개 · 연결 가능 MCP 2025-11-25

이 MCP로 할 수 있는 일

Calculates negotiation, auction, clearance-pricing, deal-scoring, and stable-matching strategies, with optional receipted sessions and encrypted agent memory.

auction_bid
Optimal auction bid
The optimal bid when you're bidding in an auction — free, no account or key needed. USE THIS WHEN: you're a bidder and want the bid that maximizes your expected surplus without overpaying. NOT for running an auction (use auction_reserve) or 1:1 haggling (use negotiate). Provide: auction_format ("first_price" sealed bid, "second_price_vickrey", or "english_ascending"); my_valuation (what the item is worth to YOU, in $); n_competing_bidders (how many OTHER bidders, not counting you); and competitor_value_prior — a rough model of what rivals will pay, e.g. {"family":"uniform","params":{"low":0,"high":6000}} (or {"family":"lognorm","params":{"mu":8.5,"sigma":0.4}}). Estimate it if unknown. Returns {optimal_bid, expected_surplus, win_probability, dominant_strategy, rationale} — bid and surplus in the SAME $ you passed in. Example: a domain worth $5,000 to you, 4 rivals who'd pay up to ~$6,000, in a sealed first-price auction -> auction_bid(auction_format="first_price", my_valuation=5000, n_competing_bidders=4, competitor_value_prior={"family":"uniform","params":{"low":0,"high":6000}}) -> optimal_bid ~$4,000, win_probability ~0.48.
읽기 전용
입력 스키마
{'type': 'object', 'title': 'gt_auction_optimal_bidArguments', 'required': ['auction_format', 'my_valuation', 'n_competing_bidders', 'competitor_value_prior'], 'properties': {'my_valuation': {'type': 'number', 'title': 'My Valuation', 'description': 'What the item is worth to YOU, in dollars.'}, 'reserve_price': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Reserve Price', 'default': None, 'description': "The auction's reserve/minimum bid in dollars, if any (optional)."}, 'risk_aversion': {'type': 'number', 'title': 'Risk Aversion', 'default': 1.0, 'description': 'Your risk aversion; 1.0 = risk-neutral (default 1.0).'}, 'auction_format': {'enum': ['first_price', 'second_price_vickrey', 'english_ascending'], 'type': 'string', 'title': 'Auction Format', 'description': "'first_price' (sealed), 'second_price_vickrey', or 'english_ascending'."}, 'n_competing_bidders': {'type': 'integer', 'title': 'N Competing Bidders', 'description': 'How many OTHER bidders there are (not counting you).'}, 'competitor_value_prior': {'type': 'object', 'title': 'Competitor Value Prior', 'description': "Rough model of what rivals will pay, e.g. {family:'uniform', params:{low:0, high:6000}} or {family:'lognorm', params:{mu:8.5, sigma:0.4}}.", 'additionalProperties': True}}}
출력 스키마
{'type': 'object', 'title': 'AuctionBidOut', 'properties': {'error': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Error', 'default': None}, 'rationale': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Rationale', 'default': None}, 'optimal_bid': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Optimal Bid', 'default': None}, 'win_probability': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Win Probability', 'default': None}, 'expected_surplus': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Expected Surplus', 'default': None}, 'dominant_strategy': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'title': 'Dominant Strategy', 'default': None}}}
auction_reserve
Revenue-optimal reserve price
The revenue-optimal reserve price when you're selling — free, no account or key needed. USE THIS WHEN: you're running an auction or sale with multiple bidders and need the floor price (minimum bid you'll accept) that maximizes your expected revenue. NOT for one-on-one haggling (use negotiate for that). Provide: n_bidders (how many bidders), seller_valuation (what the item is worth to YOU, in $), and bidder_value_prior — a rough model of what bidders will pay, e.g. {"family":"uniform","params":{"low":2000,"high":8000}}. Estimate it if unknown. Returns the reserve price and expected revenue. Example: a painting, ~5 bidders, worth $1,000 to you, bidders likely pay $2,000–$8,000 -> auction_reserve(n_bidders=5, seller_valuation=1000, bidder_value_prior={"family":"uniform","params":{"low":2000,"high":8000}}).
읽기 전용
입력 스키마
{'type': 'object', 'title': 'gt_auction_optimal_reserveArguments', 'required': ['bidder_value_prior', 'n_bidders', 'seller_valuation'], 'properties': {'n_bidders': {'type': 'integer', 'title': 'N Bidders', 'description': 'How many bidders you expect.'}, 'seller_valuation': {'type': 'number', 'title': 'Seller Valuation', 'description': 'What the item is worth to YOU, in dollars (your floor).'}, 'bidder_value_prior': {'type': 'object', 'title': 'Bidder Value Prior', 'description': "Rough model of what bidders will pay, e.g. {family:'uniform', params:{low:2000, high:8000}}.", 'additionalProperties': True}}}
출력 스키마
{'type': 'object', 'title': 'AuctionReserveOut', 'properties': {'error': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Error', 'default': None}, 'rationale': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Rationale', 'default': None}, 'reserve_price': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Reserve Price', 'default': None}, 'expected_revenue': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Expected Revenue', 'default': None}, 'expected_efficiency_loss': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Expected Efficiency Loss', 'default': None}, 'expected_revenue_no_reserve': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Expected Revenue No Reserve', 'default': None}}}
clearance_price
Clearance price & markdown schedule
Best price plus markdown schedule to clear stock by a deadline — free, no account or key needed. USE THIS WHEN: you must sell a FIXED number of units before a cutoff and demand arrives over time — event tickets, perishable inventory, end-of-life stock. NOT for 1:1 haggling (negotiate) or auctions (auction_bid/reserve). Provide: inventory (units to sell); horizon_seconds (selling window in SECONDS — 14 days = 14*24*3600 = 1209600); arrival_rate_per_second (expected shoppers per second = expected total shoppers / horizon_seconds); and buyer_arrival_prior — a rough model of willingness-to-pay, e.g. {"family":"uniform","params":{"low":40,"high":150}}. Returns {static_price (one good fixed price), static_expected_revenue, dynamic_schedule (list of {t_seconds, recommended_price} markdown waypoints), sellthrough_rate, rationale} — all prices in the SAME $ as your prior. Example: 200 tickets, 14-day window, ~600 shoppers willing to pay $40-$150 -> clearance_price(inventory=200, horizon_seconds=1209600, arrival_rate_per_second=600/1209600, buyer_arrival_prior={"family":"uniform","params":{"low":40,"high":150}}) -> static_price ~$112, schedule marks down $114 -> ~$76 as the deadline nears.
읽기 전용
입력 스키마
{'type': 'object', 'title': 'gt_mechanism_posted_price_optimalArguments', 'required': ['buyer_arrival_prior', 'arrival_rate_per_second', 'inventory', 'horizon_seconds'], 'properties': {'seed': {'type': 'integer', 'title': 'Seed', 'default': 42, 'description': 'RNG seed for reproducibility (default 42).'}, 'inventory': {'type': 'integer', 'title': 'Inventory', 'description': 'Number of units you must sell before the cutoff.'}, 'n_simulations': {'type': 'integer', 'title': 'N Simulations', 'default': 2000, 'description': 'Monte-Carlo sample count for the estimate (default 2000).'}, 'horizon_seconds': {'type': 'number', 'title': 'Horizon Seconds', 'description': 'Selling window in SECONDS (14 days = 14*24*3600 = 1209600).'}, 'buyer_arrival_prior': {'type': 'object', 'title': 'Buyer Arrival Prior', 'description': "Rough model of buyer willingness-to-pay, e.g. {family:'uniform', params:{low:40, high:150}}.", 'additionalProperties': True}, 'arrival_rate_per_second': {'type': 'number', 'title': 'Arrival Rate Per Second', 'description': 'Expected shoppers per SECOND (= expected total shoppers / horizon_seconds).'}}}
출력 스키마
{'type': 'object', 'title': 'ClearancePriceOut', 'properties': {'error': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Error', 'default': None}, 'rationale': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Rationale', 'default': None}, 'static_price': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Static Price', 'default': None}, 'dynamic_schedule': {'anyOf': [{'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, {'type': 'null'}], 'title': 'Dynamic Schedule', 'default': None}, 'sellthrough_rate': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Sellthrough Rate', 'default': None}, 'dynamic_value_estimate': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Dynamic Value Estimate', 'default': None}, 'static_expected_revenue': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Static Expected Revenue', 'default': None}, 'static_simulated_revenue': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Static Simulated Revenue', 'default': None}}}
memory_load
Load agent memory
Load a memory you saved in an earlier session — retrieval is free. Get back an encrypted blob you parked earlier (the blind locker) by its claim `ticket`. Returns {ok, blob_b64, size_bytes, expires_at} — the ciphertext you saved, which only YOU can decrypt. A wrong owner reads as a missing ticket; an expired TTL is `expired`; a lost at-rest key is `at_rest_key_unavailable`. Free (the save settled it).
읽기 전용
입력 스키마
{'type': 'object', 'title': 'store_retrieveArguments', 'required': ['api_key', 'ticket'], 'properties': {'ticket': {'type': 'string', 'title': 'Ticket', 'description': 'The claim ticket returned by memory_save.'}, 'api_key': {'type': 'string', 'title': 'Api Key', 'description': 'The same SNHP API key you saved under (a different owner reads as a missing ticket).'}}}
출력 스키마
{'type': 'object', 'title': 'MemoryLoadOut', 'properties': {'ok': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'title': 'Ok', 'default': None}, 'code': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Code', 'default': None}, 'error': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Error', 'default': None}, 'reason': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Reason', 'default': None}, 'charged': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'title': 'Charged', 'default': None}, 'blob_b64': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Blob B64', 'default': None}, 'expires_at': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Expires At', 'default': None}, 'size_bytes': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Size Bytes', 'default': None}}}
memory_save
Save agent memory (blind locker)
Persistent memory for your agent across sessions — save now, load in any later session. You encrypt before saving; the store holds only ciphertext (blind custody) and signs a receipt over its hash — it cannot read your memory. Saving uses your prepaid wallet; a new key's 50¢ starter credit covers your first saves, and loading it back (memory_load) is free. `blob_b64` is YOUR ciphertext as base64 — encrypt BEFORE saving; keys never transit, contents are never logged, so a breach leaks only sealed boxes. Charged a thin flat fee ONLY on durable store (empty/oversize/unencodable is uncharged). ttl_seconds is clamped to [60s, 7d] and the effective expires_at is returned. The receipt's content_hash is over YOUR ciphertext, so you can prove what you stored without the store ever seeing plaintext.
입력 스키마
{'type': 'object', 'title': 'store_parkArguments', 'required': ['api_key', 'blob_b64'], 'properties': {'api_key': {'type': 'string', 'title': 'Api Key', 'description': "Your SNHP API key (a new key's 50c starter credit covers first saves)."}, 'blob_b64': {'type': 'string', 'title': 'Blob B64', 'description': 'YOUR ciphertext as base64 â\x80\x94 encrypt BEFORE saving; the store holds only the sealed box and cannot read it.'}, 'ttl_seconds': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Ttl Seconds', 'default': None, 'description': 'How long to keep it, clamped to [60s, 7 days]; the effective expiry is returned (optional).'}}}
출력 스키마
{'type': 'object', 'title': 'MemorySaveOut', 'properties': {'ok': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'title': 'Ok', 'default': None}, 'code': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Code', 'default': None}, 'error': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Error', 'default': None}, 'reason': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Reason', 'default': None}, 'ticket': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Ticket', 'default': None}, 'charged': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'title': 'Charged', 'default': None}, 'receipt': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Receipt', 'default': None}, 'expires_at': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Expires At', 'default': None}, 'size_bytes': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Size Bytes', 'default': None}, 'ticket_hash': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Ticket Hash', 'default': None}, 'price_millicents': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Price Millicents', 'default': None}}}
negotiate
Negotiate — your optimal next move
Your math-optimal next move in any price negotiation — free, no account or key needed. USE THIS WHEN: you're haggling over a single PRICE across multiple back-and- forth rounds and want a better outcome than winging it. Validated edge: ~12% better head-to-head (measured on this recommender, n=20 paired LLM negotiations, 95% CI +6.5-17.4%, p<0.0001). NOT FOR: one-shot or fixed prices (it'll tell you to just negotiate directly); multi-issue bundles (use negotiate_bundle — it logrolls across several linked issues); or non-price decisions like accept-vs-decline a job offer (just reason it through). You provide only what you already know — no game theory: side "sell" or "buy" walk_away your reservation in dollars (seller=floor/minimum, buyer=ceiling/max) target your aspiration in dollars (seller=high, buyer=low) counterparty_offers their offers so far, in dollars, oldest first rounds_left (optional, default 8) roughly how many back-and-forths remain compute_ms (optional, default 0; EXPERIMENTAL) milliseconds of Monte-Carlo rollouts to spend refining the move. 0 = instant closed form. Validated to show NO realized edge over the closed form (n=400, mc_validation.py) — kept off by default as a research mechanism, not a quality improvement. The reply carries a "compute" block You get back, in dollars: {"action": "counter"|"accept"|"walk", "recommended_price": 5387.0, "message": "...the best I can do is $5,387.00", "fit": {...}, "expected_settlement": 4943.5, "confidence": 0.62} WORKED EXAMPLE — selling a contract, floor $4,000, hope $6,000, the buyer has bid $4,200 then $4,500: negotiate(side="sell", walk_away=4000, target=6000, counterparty_offers=[4200, 4500], rounds_left=6) -> counter ~$5,387 with a ready-to-send message; ACCEPT once their bid crosses the optimal target; WALK if they stay below your floor near the deadline. Works against ANY counterparty with zero setup. (The verified-peer cooperation premium is the separate, advanced gt_a2a_* flow on the pro door.)
읽기 전용
입력 스키마
{'type': 'object', 'title': 'gt_negotiate_turnArguments', 'required': ['side', 'walk_away', 'target'], 'properties': {'item': {'type': 'string', 'title': 'Item', 'default': 'this', 'description': "Short label for what's being negotiated (used only in the drafted message)."}, 'side': {'type': 'string', 'title': 'Side', 'description': "Which side you are: 'sell' or 'buy'."}, 'target': {'type': 'number', 'title': 'Target', 'description': 'Your aspiration price in dollars (seller: high; buyer: low).'}, 'walk_away': {'type': 'number', 'title': 'Walk Away', 'description': "Your reservation price in dollars â\x80\x94 the worst you'd accept (seller: your floor/minimum; buyer: your ceiling/maximum)."}, 'compute_ms': {'type': 'integer', 'title': 'Compute Ms', 'default': 0, 'description': 'EXPERIMENTAL. Milliseconds of Monte-Carlo rollouts to spend refining the move; 0 = instant closed form (validated to show no realized edge, off by default).'}, 'rounds_left': {'type': 'integer', 'title': 'Rounds Left', 'default': 8, 'description': 'Roughly how many back-and-forth rounds remain before the deadline (default 8).'}, 'my_previous_offers': {'anyOf': [{'type': 'array', 'items': {'type': 'number'}}, {'type': 'null'}], 'title': 'My Previous Offers', 'default': None, 'description': 'Your own offers so far, in dollars, oldest first (optional context).'}, 'counterparty_offers': {'anyOf': [{'type': 'array', 'items': {'type': 'number'}}, {'type': 'null'}], 'title': 'Counterparty Offers', 'default': None, 'description': "The other side's offers so far, in dollars, oldest first. Omit if they haven't offered yet."}}}
출력 스키마
{'type': 'object', 'title': 'NegotiateOut', 'properties': {'fit': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Fit', 'default': None}, 'error': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Error', 'default': None}, 'action': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Action', 'default': None}, 'compute': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Compute', 'default': None}, 'message': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Message', 'default': None}, 'rationale': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Rationale', 'default': None}, 'confidence': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Confidence', 'default': None}, 'recommended_price': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Recommended Price', 'default': None}, 'expected_settlement': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Expected Settlement', 'default': None}}}
negotiate_bundle
Negotiate a bundle — logroll linked issues
Negotiate several linked issues at once by logrolling — free, no account or key needed. USE THIS WHEN: a deal has more than one issue on the table and they trade off — a job offer (base + equity + signing), a SaaS contract (price + seats + term + SLA), any package deal. It concedes on the issues you care about LESS (and the other side cares about MORE) to win the ones you care about most — a trade that beats splitting every issue down the middle. For a single PRICE, use negotiate instead. Provide `issues`: a list of {"name", "options" (the choices), "my_utility" (how good each option is to YOU — one number per option, any scale), "their_utility" (how good each option is to THEM — their preference direction)}. Optionally `my_priorities` ({issue_name: weight}, how much each issue matters to you) and `their_offers` (their packages so far as {issue_name: option}, oldest first — this is what lets it INFER their priorities). Returns {action, recommended_offer (issue -> option), message, my_utility, their_expected_utility, inferred_their_priorities, trade_logic, fit, confidence, acceptance_probability}. Validated (separately from the single-issue +12%): returns a Pareto-efficient package that beats naive "split-every-issue-down-the-middle" bargaining by ~40% joint surplus (300 random 4-issue profiles). HONEST CAVEAT: the priority INFERENCE layered on top is weak (recovery r≈0.3) and currently adds only ~1% (and can be slightly NEGATIVE against some opponents) over the same engine run with no inference — so the proven value today is the efficient-package search, not (yet) the logrolling edge. Optional timing refinement: pass `rounds_left` (bargaining rounds remaining) with `compute_ms` > 0 to spend that many ms of Monte-Carlo rollouts choosing WHICH package to hold for as the other side concedes over the rounds — a firmer package closes later (discounted) than a generous one. 0 = the instant closed-form package; the reply then carries a `compute` block. Modest by design (never worse than the closed form in-model; helps on a minority of deals). Example: a SaaS contract — you most want a low price_per_seat, can flex on seats/term/SLA. negotiate_bundle(issues=[ {"name":"price_per_seat","options":["$50","$40","$30"],"my_utility":[0,0.5,1],"their_utility":[1,0.5,0]}, {"name":"sla","options":["99%","99.9%"],"my_utility":[0,1],"their_utility":[1,0]} ...], my_priorities={"price_per_seat":0.55,"sla":0.1,...}, their_offers=[...]) -> a full package that gives ground on SLA to hold the price.
읽기 전용
입력 스키마
{'type': 'object', 'title': 'gt_negotiate_bundleArguments', 'required': ['issues'], 'properties': {'issues': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'title': 'Issues', 'description': 'One dict per issue: {name, options (the choices), my_utility (value of each option to YOU), their_utility (value to THEM)} â\x80\x94 utilities are one number per option, any scale.'}, 'my_batna': {'type': 'number', 'title': 'My Batna', 'default': 0.4, 'description': 'Your best alternative to no deal, as a utility fraction in [0,1] (default 0.40); the returned package is guaranteed to beat it.'}, 'compute_ms': {'type': 'integer', 'title': 'Compute Ms', 'default': 0, 'description': 'EXPERIMENTAL. Milliseconds of rollouts to choose WHICH package to hold as they concede; 0 = instant closed-form package.'}, 'rounds_left': {'type': 'integer', 'title': 'Rounds Left', 'default': 8, 'description': 'Bargaining rounds remaining (used with compute_ms for the timing tier; default 8).'}, 'their_offers': {'anyOf': [{'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, {'type': 'null'}], 'title': 'Their Offers', 'default': None, 'description': 'Packages the other side has tabled, oldest first, each as {issue_name: chosen_option} â\x80\x94 lets it infer their priorities.'}, 'my_priorities': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'My Priorities', 'default': None, 'description': '{issue_name: weight} â\x80\x94 how much each issue matters to you (any scale). Optional.'}, 'their_batna_estimate': {'type': 'number', 'title': 'Their Batna Estimate', 'default': 0.4, 'description': "Your estimate of the other side's BATNA, [0,1] (default 0.40)."}}}
출력 스키마
{'type': 'object', 'title': 'NegotiateBundleOut', 'properties': {'fit': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Fit', 'default': None}, 'error': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Error', 'default': None}, 'action': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Action', 'default': None}, 'compute': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Compute', 'default': None}, 'message': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Message', 'default': None}, 'confidence': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Confidence', 'default': None}, 'my_utility': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'My Utility', 'default': None}, 'trade_logic': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Trade Logic', 'default': None}, 'recommended_offer': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Recommended Offer', 'default': None}, 'acceptance_probability': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Acceptance Probability', 'default': None}, 'their_expected_utility': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Their Expected Utility', 'default': None}, 'inferred_their_priorities': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Inferred Their Priorities', 'default': None}}}
score_deal
Score a deal against the Pareto frontier
Score how good a deal is against your floor/target — free, no account or key needed. Score a settled package against the exact Pareto frontier — the SNHP leaderboard metric ("dollars left on the table") for YOUR negotiation. Args: issues: one dict per issue: {"name": str, "options": [labels], "my_utility": [per-option value to me], "their_utility": [per-option value to them]} — both sides' TRUE per-option values. my_weights: {issue_name: weight} — my true priorities (any scale). their_weights: {issue_name: weight} — their true priorities. package: the settled deal, {issue_name: option_label}. notional: deal size in dollars for the dollars-left framing. Returns realized joint welfare, the frontier best, the naive middle-split baseline, frontier capture, logroll capture, and dollars_left_on_table.
읽기 전용
입력 스키마
{'type': 'object', 'title': 'score_dealArguments', 'required': ['issues', 'my_weights', 'their_weights', 'package'], 'properties': {'issues': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'title': 'Issues', 'description': "One dict per issue: {name, options, my_utility, their_utility} â\x80\x94 both sides' TRUE per-option values (one number per option)."}, 'package': {'type': 'object', 'title': 'Package', 'description': 'The settled deal as {issue_name: chosen_option_label}.', 'additionalProperties': True}, 'notional': {'type': 'number', 'title': 'Notional', 'default': 10000.0, 'description': "Deal size in dollars, used for the 'dollars left on the table' framing (default 10000)."}, 'my_weights': {'type': 'object', 'title': 'My Weights', 'description': '{issue_name: weight} â\x80\x94 your true priorities (any scale).', 'additionalProperties': True}, 'their_weights': {'type': 'object', 'title': 'Their Weights', 'description': '{issue_name: weight} â\x80\x94 their true priorities (any scale).', 'additionalProperties': True}}}
출력 스키마
{'type': 'object', 'title': 'ScoreDealOut', 'properties': {'error': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Error', 'default': None}, 'my_utility': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'My Utility', 'default': None}, 'naive_split': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Naive Split', 'default': None}, 'frontier_best': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Frontier Best', 'default': None}, 'joint_welfare': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Joint Welfare', 'default': None}, 'their_utility': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Their Utility', 'default': None}, 'logroll_capture': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Logroll Capture', 'default': None}, 'frontier_capture': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Frontier Capture', 'default': None}, 'dollars_left_on_table': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Dollars Left On Table', 'default': None}}}
session_advise
Session move — next single-price offer
Your next move inside a receipted session (single-issue) — no additional charge (the $2 at session_open covered it). Pass the FULL offer history each time, oldest first. Returns move, exact price, ready-to-send message, and the receipt (why[], context_hash, deterministic compute block).
입력 스키마
{'type': 'object', 'title': 'nextmove_adviseArguments', 'required': ['api_key', 'session_id', 'their_offers'], 'properties': {'api_key': {'type': 'string', 'title': 'Api Key', 'description': 'The API key that opened the session.'}, 'my_offers': {'anyOf': [{'type': 'array', 'items': {'type': 'number'}}, {'type': 'null'}], 'title': 'My Offers', 'default': None, 'description': 'Your own offer history, in dollars, oldest first (optional).'}, 'session_id': {'type': 'string', 'title': 'Session Id', 'description': 'The session_id returned by session_open.'}, 'rounds_left': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Rounds Left', 'default': None, 'description': 'Bargaining rounds remaining (optional).'}, 'their_offers': {'type': 'array', 'items': {'type': 'number'}, 'title': 'Their Offers', 'description': 'The FULL counterparty offer history, in dollars, oldest first.'}}}
출력 스키마
{'type': 'object', 'title': 'SessionAdviseOut', 'properties': {'why': {'anyOf': [{'type': 'array', 'items': {}}, {'type': 'null'}], 'title': 'Why', 'default': None}, 'move': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Move', 'default': None}, 'error': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Error', 'default': None}, 'offer': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Offer', 'default': None}, 'compute': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Compute', 'default': None}, 'message': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Message', 'default': None}, 'receipt': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Receipt', 'default': None}, 'policy_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Policy Id', 'default': None}, 'move_index': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Move Index', 'default': None}, 'context_hash': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Context Hash', 'default': None}, 'confidence_note': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Confidence Note', 'default': None}}}
session_bundle
Session move — multi-issue bundle
Multi-issue logrolled advice inside a receipted session — no additional charge. The logrolling tier, the thing the free tool does NOT have. Trade the issues you care less about for the ones you value: issues = [{name, options, my_utility (per option), their_utility (your read of their direction)}]; their_offers = packages they've tabled, oldest first. Returns the recommended package, trade logic, inferred counterparty priorities, acceptance probability, and the receipt. Deterministic closed form — no rollout theater. The package is guaranteed to clear YOUR stated BATNA (enforced, not promised).
입력 스키마
{'type': 'object', 'title': 'nextmove_bundleArguments', 'required': ['api_key', 'session_id', 'issues'], 'properties': {'issues': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'title': 'Issues', 'description': 'One dict per issue: {name, options, my_utility (per option), their_utility (your read of their direction)}.'}, 'api_key': {'type': 'string', 'title': 'Api Key', 'description': 'The API key that opened the session.'}, 'my_batna': {'type': 'number', 'title': 'My Batna', 'default': 0.4, 'description': 'Your BATNA as a utility fraction in [0,1] (default 0.40); the package is guaranteed to clear it.'}, 'session_id': {'type': 'string', 'title': 'Session Id', 'description': 'The session_id returned by session_open.'}, 'cooperation': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Cooperation', 'default': None, 'description': 'Optional cooperation dial in [0,1] biasing toward joint surplus.'}, 'their_offers': {'anyOf': [{'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, {'type': 'null'}], 'title': 'Their Offers', 'default': None, 'description': "Packages they've tabled, oldest first, each {issue_name: option} (optional)."}, 'my_priorities': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'My Priorities', 'default': None, 'description': '{issue_name: weight} â\x80\x94 how much each issue matters to you (optional).'}, 'their_batna_estimate': {'type': 'number', 'title': 'Their Batna Estimate', 'default': 0.4, 'description': 'Your estimate of their BATNA, [0,1] (default 0.40).'}}}
출력 스키마
{'type': 'object', 'title': 'SessionBundleOut', 'properties': {'why': {'anyOf': [{'type': 'array', 'items': {}}, {'type': 'null'}], 'title': 'Why', 'default': None}, 'move': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Move', 'default': None}, 'error': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Error', 'default': None}, 'message': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Message', 'default': None}, 'package': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Package', 'default': None}, 'receipt': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Receipt', 'default': None}, 'move_index': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Move Index', 'default': None}, 'context_hash': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Context Hash', 'default': None}, 'confidence_note': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Confidence Note', 'default': None}, 'acceptance_probability': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Acceptance Probability', 'default': None}, 'their_expected_utility': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Their Expected Utility', 'default': None}}}
session_close
Close session & get the signed receipt
Close a receipted session and get the signed summary receipt. Optional — sessions also expire on their own — but closing timestamps the outcome, which helps the machine learn real round-counts per category. Returns the `closed` flag AND a signed session-summary receipt (GAUNTLET #4) — moves count, total charged (one $2 open), and the per-move context_hashes — to hand your principal. An unknown session or key mismatch leaves `closed` false and returns an `error` instead of the receipt (indistinguishable, so a session id can't be probed).
멱등성
입력 스키마
{'type': 'object', 'title': 'nextmove_closeArguments', 'required': ['api_key', 'session_id'], 'properties': {'api_key': {'type': 'string', 'title': 'Api Key', 'description': 'The API key that opened the session.'}, 'session_id': {'type': 'string', 'title': 'Session Id', 'description': 'The session_id to close.'}}}
출력 스키마
{'type': 'object', 'title': 'SessionCloseOut', 'properties': {'error': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Error', 'default': None}, 'closed': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'title': 'Closed', 'default': None}, 'receipt': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Receipt', 'default': None}}}
session_open
Open a $2 receipted session
Open a $2 receipted negotiation session: deterministic, replayable, every move signed. PAID ($2 once, from your credit balance) — the $2 covers EVERY move of this negotiation (up to 10 moves, 7 days), tuned to the category. A new key's 50¢ starter credit is a taste, not enough for a session — top up first. category: resale | supply | retail. side: buy | sell. walk_away = your true floor (sell) / ceiling (buy) — private, never crossed. Pass their_offers to get the first move back immediately with the session. Subsequent moves: session_advise with the session_id — no further charge.
입력 스키마
{'type': 'object', 'title': 'nextmove_openArguments', 'required': ['api_key', 'category', 'side', 'walk_away', 'target'], 'properties': {'seed': {'type': 'integer', 'title': 'Seed', 'default': 0, 'description': 'RNG seed for the deterministic engine (default 0).'}, 'side': {'type': 'string', 'title': 'Side', 'description': "Which side you're on: 'buy' or 'sell'."}, 'target': {'type': 'number', 'title': 'Target', 'description': 'Your aspiration price in dollars.'}, 'api_key': {'type': 'string', 'title': 'Api Key', 'description': 'Your SNHP API key; $2 is debited from its credit balance (covers every move of this one negotiation).'}, 'category': {'type': 'string', 'title': 'Category', 'description': "Negotiation category for tuning: 'resale' | 'supply' | 'retail'."}, 'my_offers': {'anyOf': [{'type': 'array', 'items': {'type': 'number'}}, {'type': 'null'}], 'title': 'My Offers', 'default': None, 'description': 'Your own offers so far, in dollars, oldest first (optional).'}, 'walk_away': {'type': 'number', 'title': 'Walk Away', 'description': 'Your true reservation in dollars â\x80\x94 floor (sell) / ceiling (buy); private, never crossed.'}, 'rounds_left': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Rounds Left', 'default': None, 'description': 'Bargaining rounds remaining for this move (optional; overrides the category default).'}, 'their_offers': {'anyOf': [{'type': 'array', 'items': {'type': 'number'}}, {'type': 'null'}], 'title': 'Their Offers', 'default': None, 'description': "The other side's offers so far, in dollars, oldest first â\x80\x94 pass to get the first move back with the session (optional)."}}}
출력 스키마
{'type': 'object', 'title': 'SessionOpenOut', 'properties': {'side': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Side', 'default': None}, 'error': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Error', 'default': None}, 'funding': {'title': 'Funding', 'default': None}, 'receipt': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Receipt', 'default': None}, 'category': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Category', 'default': None}, 'max_moves': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Max Moves', 'default': None}, 'expires_at': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Expires At', 'default': None}, 'first_move': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'First Move', 'default': None}, 'how_to_pay': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'How To Pay', 'default': None}, 'session_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Session Id', 'default': None}, 'price_cents': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Price Cents', 'default': None}, 'context_hash': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Context Hash', 'default': None}, 'balance_after': {'title': 'Balance After', 'default': None}, 'first_move_error': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'First Move Error', 'default': None}, 'price_millicents': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Price Millicents', 'default': None}}}
stable_match
Stable matching (Gale–Shapley)
Match two groups by their rankings so no pair wants to swap — free, no account or key needed. A STABLE matching: USE THIS WHEN you're assigning two sides to each other by mutual preference — interns<->teams, students<->schools, mentors<->mentees — and want a result with no "blocking pair" (no person+slot that both prefer each other over what they got). Provide proposers and receivers, each a list of {"id": name, "preferences": [ids of the OTHER side, most-wanted first]}. Receivers may add "capacity" (default 1) to accept several. Returns {matching (name -> name), unmatched_proposers, blocking_pairs (empty list = provably stable), n_proposals}. NOTE: the result is PROPOSER-optimal, so put the side you want to favor in `proposers`. Example: stable_match( proposers=[{"id":"Ana","preferences":["Growth","Core"]}, {"id":"Ben","preferences":["Core","Growth"]}], receivers=[{"id":"Growth","preferences":["Ben","Ana"]}, {"id":"Core","preferences":["Ana","Ben"]}]) -> matching {"Ana":"Growth","Ben":"Core"}, blocking_pairs [].
읽기 전용
입력 스키마
{'type': 'object', 'title': 'gt_mechanism_gale_shapleyArguments', 'required': ['proposers', 'receivers'], 'properties': {'proposers': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'title': 'Proposers', 'description': 'List of {id, preferences:[ids of the OTHER side, most-wanted first]}. The result is PROPOSER-optimal â\x80\x94 put the side you want to favor here.'}, 'receivers': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'title': 'Receivers', 'description': 'List of {id, preferences:[...], capacity (optional, default 1)}.'}}}
출력 스키마
{'type': 'object', 'title': 'StableMatchOut', 'properties': {'error': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Error', 'default': None}, 'matching': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Matching', 'default': None}, 'n_proposals': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'N Proposals', 'default': None}, 'blocking_pairs': {'anyOf': [{'type': 'array', 'items': {}}, {'type': 'null'}], 'title': 'Blocking Pairs', 'default': None}, 'unmatched_proposers': {'anyOf': [{'type': 'array', 'items': {}}, {'type': 'null'}], 'title': 'Unmatched Proposers', 'default': None}}}
store_catalog
Store catalog & wallet balance
See what's on the shelf — free, no key needed: prices, predicates, receipt scheme, and your balance. THE STORE: one counter, one prepaid wallet, many slots. One read covers the whole shelf — the commodity slots, the blind locker (agent memory), and the paid receipted-session SKU (folds in what nextmove_catalog used to report separately). Every commodity slot settles ON DELIVERY: the wallet is debited only when a machine-checkable predicate passes — a failed fetch is never charged, because here you cannot pay for nothing. Each receipt names the backend that served and its EXACT wholesale cost (passthrough, no per-call markup); the counter's cut is a published fee on wallet top-ups, not on the calls — 5% + a fixed 30¢ per transaction (the 30¢ is the card rail's own per-transaction toll, passed through). Every new key gets a one-time 50¢ starter credit — unconditional, no card — enough to taste the shelf before funding it. Don't see the capability you need? store_request logs it; unmet demand decides what gets stocked next. Returns the money unit (millicents, 1000 per cent), per-slot {tier, max_price_millicents, predicate_id, request_doc, serving-backend ids}, the anchor SKUs, the paid_session card, and the two pricing facts. Never returns key material.
읽기 전용
입력 스키마
{'type': 'object', 'title': 'store_catalogArguments', 'properties': {}}
출력 스키마
{'type': 'object', 'title': 'StoreCatalogOut', 'properties': {'keys': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Keys', 'default': None}, 'unit': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Unit', 'default': None}, 'error': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Error', 'default': None}, 'slots': {'anyOf': [{'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, {'type': 'null'}], 'title': 'Slots', 'default': None}, 'admission': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Admission', 'default': None}, 'counter_fee': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Counter Fee', 'default': None}, 'paid_session': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Paid Session', 'default': None}, 'starter_credit': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Starter Credit', 'default': None}, 'counter_fee_pct': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Counter Fee Pct', 'default': None}, 'request_privacy': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Request Privacy', 'default': None}, 'millicents_per_cent': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Millicents Per Cent', 'default': None}}}
store_request
Request a capability / check a filing
Ask for a capability we don't sell yet — free; filings are public and drive what we stock. Two reads in one tool (absorbs the old store_request_status / nextmove_request): pass `request_id` to RE-QUERY a filing's status instead of filing anew — returns {found, request_id, status, status_note, filed_at, door, text} (found: false on an unknown id). Without a request_id it FILES a new ask and returns {request_id, status, watch, check}: every filing is logged verbatim (size-capped, stored as data, never rendered raw) and gets an id you can come back to (GAUNTLET #5). Check any filing with GET /v1/store/request/{id}; the public count is GET /v1/store/requests. Unmet demand decides what gets stocked next — the shelf writes itself from what agents ask for and can't get. Pass watch=True WITH an api_key when filing to flag the ask for a heads-up on a status flip (poll store_my_requests to see it — poll-based, no push); an anonymous watch is ignored, and the chosen flag is echoed as `watch`.
입력 스키마
{'type': 'object', 'title': 'store_requestArguments', 'properties': {'text': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Text', 'default': None, 'description': "What capability you want that we don't stock yet (free-text). Omit when re-querying with request_id."}, 'watch': {'type': 'boolean', 'title': 'Watch', 'default': False, 'description': 'Set True (with an api_key) to flag the ask for a status-flip heads-up; anonymous watches are ignored.'}, 'api_key': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Api Key', 'default': None, 'description': 'Your SNHP API key (optional; required only if you set watch=True).'}, 'request_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Request Id', 'default': None, 'description': 'Pass an existing filing id to RE-QUERY its status instead of filing a new request.'}}}
출력 스키마
{'type': 'object', 'title': 'StoreRequestOut', 'properties': {'door': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Door', 'default': None}, 'text': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Text', 'default': None}, 'check': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Check', 'default': None}, 'error': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Error', 'default': None}, 'found': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'title': 'Found', 'default': None}, 'watch': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'title': 'Watch', 'default': None}, 'status': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Status', 'default': None}, 'filed_at': {'title': 'Filed At', 'default': None}, 'request_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Request Id', 'default': None}, 'status_note': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Status Note', 'default': None}, 'same_ask_count': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Same Ask Count', 'default': None}}}
추가됨
store_request
2026년 9월 17일 12:49 PM
추가됨
store_catalog
2026년 9월 17일 12:49 PM
추가됨
session_close
2026년 9월 17일 12:49 PM
추가됨
session_bundle
2026년 9월 17일 12:49 PM
추가됨
session_advise
2026년 9월 17일 12:49 PM
추가됨
session_open
2026년 9월 17일 12:49 PM
추가됨
memory_load
2026년 9월 17일 12:49 PM
추가됨
memory_save
2026년 9월 17일 12:49 PM
추가됨
stable_match
2026년 9월 17일 12:49 PM
추가됨
clearance_price
2026년 9월 17일 12:49 PM
추가됨
auction_reserve
2026년 9월 17일 12:49 PM
추가됨
auction_bid
2026년 9월 17일 12:49 PM
추가됨
score_deal
2026년 9월 17일 12:49 PM
추가됨
negotiate_bundle
2026년 9월 17일 12:49 PM
추가됨
negotiate
2026년 9월 17일 12:49 PM