Confirm Onboarding Upload
confirm_onboarding_uploadFull Description
Confirm an onboarding file upload by updating DynamoDB references.
Parameters (2 required)
categorystringFile category
filenamestringOriginal file name
Medeloop Grants helps researchers and program teams move from “What should we apply for?” to a credible first draft without switching tools or starting from scratch. Inside ChatGPT, it combines curated grant data, your professional context, and purpose-built drafting workflows into a single experience. You can ask for relevant funding opportunities, quickly understand whether you’re a good fit, and begin drafting a proposal in the same conversation. What makes it useful in practice is how the pieces connect. Instead of returning a long list of generic results, Medeloop matches grants to your background and research focus, helping you prioritize opportunities that are actually feasible. It also surfaces key constraints like eligibility and deadlines early, so you spend less time chasing grants that are unlikely to work. When you’re ready to write, the platform guides you through structured inputs and generates a solid first-pass draft that you can refine. The drafting process builds on the same context used for discovery, so you don’t have to repeat yourself or reframe your work each time. People tend to value Medeloop Grants because it reduces the overhead around grant work. It helps them focus on the substance of their research instead of navigating fragmented tools, reformatting information, or second-guessing fit. Over time, as it learns from your inputs and past work, it becomes more tailored to how you search and write. The result is a more continuous workflow from discovery to draft, with less friction and fewer wasted cycles.
confirm_onboarding_uploadConfirm an onboarding file upload by updating DynamoDB references.
categorystringFile category
filenamestringOriginal file name
confirm_uploadRecord a completed upload in the database.
Two-step flow: (1) get_upload_url returns a presigned S3 PUT URL, (2) after the widget uploads the file to S3, this tool records the upload metadata (key, filename, size) in the ProposalDocument table.
filenamestringOriginal file name
proposal_idstringProposal ID
s3_keystringS3 key returned from get_upload_url
content_typestringMIME content type
nullsizeintegerFile size in bytes (max 100 MB)
0create_proposalCreate a new proposal and return its server-generated ID.
opportunity_numberstringGrant opportunity number
delete_onboarding_fileDelete an onboarding file from S3 and DynamoDB.
categorystringFile category
file_namestringFile name to delete
export_proposal_docxExport proposal to Word (DOCX) format.
proposal_idstringProposal ID
export_proposal_pdfExport proposal to PDF format (via DOCX → LibreOffice conversion).
proposal_idstringProposal ID
find_custom_grantsOpens an interactive grants discovery widget that finds grants personalized to the researcher's profile.
Use this tool whenever the user wants to:
This tool opens a widget that: 1. Checks if the user has completed their researcher profile setup 2. If not, guides them through onboarding first 3. Then searches for grants using their profile + any specific queries you provide
queries (array of strings): Search terms for grants[] = search based on user's profile/research interestsfind_custom_grants(queries=[])
find_custom_grants(queries=["cancer research", "oncology", "tumor biology"])
find_custom_grants(queries=["machine learning", "artificial intelligence", "deep learning"])
search_grants directly - that's for internal widget use onlyqueriesarraySearch queries for grants (max 20). Empty list means search based on user's profile research interests.
[]generate_intake_questionsGenerate AI-driven follow-up intake questions based on Round 1 answers.
proposal_idstringProposal ID
generate_proposal_templateGenerate a grant template based on opportunity number.
opportunity_numberstringGrant opportunity number
get_intake_stateRetrieve intake state: Round 1/2 answers and revision.
proposal_idstringProposal ID
get_my_biosketchGet my biosketch as a string
get_my_cvGet my CV as a string
get_my_grantsGet my previously written grants relevant to the query as a list of {file_name, text}
querystringSearch query
limitintegerMax number of results
10get_my_interestsGet my research interests and topics. Use this tool when user asks me to find recommended grants for my profile
get_my_key_recent_publicationsGet my key recent publications relevant to the query as a list of {file_name, text}. These are key publications that I uploaded to the system.
querystringSearch query
limitintegerMax number of results
10get_my_profileGet my researcher information (name, position, institution, research interests)
get_my_publicationsGet my publications relevant to the query as a list of {file_name, text}. These are publications found from my Google Scholar profile.
querystringSearch query
limitintegerMax number of results
10get_onboarding_statusGet the current user's onboarding status and profile data. Returns onboarding completion status and all profile fields.
Field names match medeloop-app-api DTO format (camelCase).
get_onboarding_upload_urlGet a presigned S3 PUT URL for onboarding file upload.
Widget flow: 1. callTool("get_onboarding_upload_url", {...}) → {url, key} 2. fetch(PUT, url, file_body) — direct to S3 3. callTool("confirm_onboarding_upload", {...}) — if needed
categorystringFile category: biosketch, cv, previousGrants, keyRecentPublications
filenamestringOriginal file name
content_typestringMIME content type
application/pdfget_proposal_completion_stateReturn proposal restore status for refresh handling.
proposal_idstringProposal ID
get_upload_urlGenerate a presigned S3 PUT URL so the widget can upload directly.
filenamestringOriginal file name
proposal_idstringProposal ID
content_typestringMIME content type
application/pdflist_proposalsList the current user's proposals.
poll_proposal_updatesPoll for new proposal section updates from the database.
proposal_idstringProposal ID
last_seen_idintegerLast seen record ID for cursor-based polling
0retrieve_section_instructionRetrieve writing instructions for a specific proposal section.
Section can be one of:
sectionstringRetrieve writing instructions and tips for a specific proposal section. Options: 'specific_aims', 'significance', 'approach', 'others'. Use 'others' for general grant-writing tips.
save_intake_answersSave user intake answers for a proposal.
answersobjectAnswer key-value pairs
proposal_idstringProposal ID
roundintegerRound number (1 or 2)
revisionstringRevision ID (required for round 2)
nullsave_section_editPersist a user's manual edit to a proposal section.
contentstringEdited section content
proposal_idstringProposal ID
section_pathstringSection path
search_grantsSearch for research grants using semantic search with multiple queries.
This tool accepts an ARRAY of search queries and automatically executes all queries, combines the results, and deduplicates them for you.
search_grants(queries=["machine learning computer vision", "deep learning neural networks"])When user asks "find grants" or "grants for my profile":
**MANDATORY WORKFLOW
1. **Gather researcher context
Call get_my_research_context() to get complete researcher profile:
This single tool call replaces the need to call 6 separate tools and provides all the context needed to generate targeted grant queries.
2. Analyze and identify themes:
3. Generate 2-3 DIFFERENT targeted queries:
4. **Execute search with multiple queries
search_grants() ONCE with an array of 2-3 DIFFERENT queriesnum_results=20 to get comprehensive results per querysearch_grants(queries=["cancer immunotherapy", "tumor microenvironment", "CAR-T cell therapy"], num_results=20)5. Present results with context:
User says: "find me grants"
Step 1
get_my_research_context():context = get_my_research_context(publications_limit=5)Step 2
Step 3
search_grants(
queries=[
"[primary research area] [methodology]",
"[domain] [technical approach]",
"[alternative angle] [subdomain]"
],
num_results=20
)
The tool automatically combines and deduplicates ~40-60 results from the searches.
queries parameter with an array of 1+ search termsWhen presenting results to user, ALWAYS show:
If the user wants to draft a proposal for a grant you found:
write_grant_proposal(opportunity_number=...) using the grant’s opportunityNumber from the search results.draft_key=... so the same proposal can be resumed after refresh.deadline_afterstringDeadline after date (YYYY-MM-DD)
nullfunderstringFilter by funder name
nullmax_amountnumberMaximum funding amount USD (must be non-negative)
nullmin_amountnumberMinimum funding amount USD (must be non-negative)
nullnum_resultsintegerNumber of results per query
20queriesarrayList of search queries for grants (max 20). If not provided and use_profile=True, queries will be auto-generated from the user's research interests.
nulluse_profilebooleanIf True and queries is empty/not provided, automatically use the user's research interests as search queries. Set to False only if you want to search with explicit queries and ignore the user's profile.
Truestart_proposal_agentStart the background grant writing agent for a proposal.
intakeobjectIntake payload with rounds and answers
opportunity_numberstringGrant opportunity number
proposal_idstringProposal ID
submit_section_answersSubmit user answers for a specific proposal section.
answersobjectAnswer key-value pairs
proposal_idstringProposal ID
section_pathstringSection path
update_onboardingUpdate onboarding profile data.
updatesobjectOnboarding fields to update (camelCase)
write_grant_proposalUse this tool when the user requests to write or draft a grant proposal. You must use this tool when the user requests to write a proposal for a grant you found in the search results. This tool will initiate an interactive grant proposal widget to allow the user to interact with the written proposal.
CRITICAL: You MUST use the 'opportunityNumber' field from search_grants results!
Example of CORRECT usage:
Example of WRONG usage:
Some examples of user requests that should trigger this tool:
opportunity_numberstringMUST be opportunityNumber from search results (NOT the id field)
draft_keystringStable draft session key. If you are resuming a proposal and have a draft_key from the widget or prior tool output, you MUST pass it unchanged so the same proposal can be reopened.